什么是…在这个React(使用JSX)代码中做什么,它被称为什么?

<Modal {...this.props} title='Modal heading' animation={false}>

当前回答

向Brandon Morelli致敬。他在这里解释得很好,但链接可能会消失,所以我只是粘贴下面的内容:

扩展语法就是三个点:… 它允许迭代对象在需要0+参数的地方展开。 没有上下文的定义很难。让我们探索一些不同的用例来帮助理解这意味着什么。

例1 -插入数组

看看下面的代码。在这段代码中,我们没有使用spread语法:

Var mid = [3,4]; Var arr = [1,2, mid, 5,6]; console.log (arr);

上面,我们已经创建了一个名为mid的数组,然后我们创建了第二个包含我们的mid数组的数组。最后,我们登出结果。你希望arr打印什么?点击上面的运行看看会发生什么。输出如下:

[1, 2, [3, 4], 5, 6]

这是你预期的结果吗?

通过将mid数组插入到arr数组中,我们就得到了一个数组中的一个数组。如果这是我们的目标,那也没关系。但是如果您只想要一个值从1到6的数组呢?要做到这一点,我们可以使用spread语法!请记住,展开语法允许数组的元素展开。

让我们看看下面的代码。一切都是一样的-除了我们现在使用spread语法将mid数组插入到arr数组中:

Var mid = [3,4]; Var arr =[1,2,…]Mid, 5,6]; console.log (arr);

当你点击运行按钮时,结果是这样的:

[1, 2, 3, 4, 5, 6]

太棒了!

还记得刚才读到的扩展语法定义吗?这就是它发挥作用的地方。如你所见,当我们创建arr数组并在中间数组上使用展开运算符时,中间数组不仅被插入,还会展开。这种展开意味着中间数组中的每个元素都被插入到arr数组中。结果不是嵌套数组,而是一个从1到6的数字数组。

例2 -数学

JavaScript有一个内置的数学对象,允许我们进行一些有趣的数学计算。在本例中,我们将查看Math.max()。如果您不熟悉,Math.max()返回0或多个数字中最大的一个。下面是一些例子:

Math.max();
// -Infinity
Math.max(1, 2, 3);
// 3
Math.max(100, 3, 4);
// 100

如您所见,如果要找到多个数字的最大值,Math.max()需要多个参数。不幸的是,您不能简单地使用单个数组作为输入。在使用扩展语法之前,在数组上使用Math.max()最简单的方法是使用.apply()。

Var arr = [2,4,8,6,0]; 函数max(arr) { Math.max返回。应用(null, arr); } console.log (max (arr));

它很管用,只是真的很烦人。

现在看看我们如何用spread语法做同样的事情:

Var arr = [2,4,8,6,0]; var max = Math.max(…arr); console.log (max);

我们不需要创建函数并利用apply方法返回Math.max()的结果,只需要两行代码!扩展语法展开数组元素,并将数组中的每个元素分别输入Math.max()方法!

例3 -复制Array

在JavaScript中,不能通过将新变量设置为已经存在的数组来复制数组。考虑下面的代码示例:

Var arr = ['a', 'b', 'c']; Var arr2 = arr; console.log (arr2);

当你按下run,你会得到以下输出:

['a', 'b', 'c']

现在,乍一看,它看起来是可行的-看起来我们已经把arr的值复制到arr2中。但事实并非如此。你看,在JavaScript中处理对象(数组是对象的一种类型)时,我们通过引用而不是通过值赋值。这意味着arr2被分配给了与arr相同的引用。换句话说,我们对arr2所做的任何事情也会影响原始的arr数组(反之亦然)。看看下面的内容:

Var arr = ['a', 'b', 'c']; Var arr2 = arr; arr2.push (' d '); console.log (arr);

上面,我们将一个新元素d放入arr2中。然而,当我们注销arr的值时,你会看到d的值也被添加到该数组中:

['a', 'b', 'c', 'd']

不过没必要害怕!我们可以使用扩展运算符! 考虑下面的代码。几乎和上面一样。相反,我们在一对方括号中使用了展开操作符:

Var arr = ['a', 'b', 'c']; Var arr2 =[…arr]; console.log (arr2);

点击运行,你将看到预期的输出:

['a', 'b', 'c']

上面,arr中的数组值扩展为单独的元素,然后赋值给arr2。现在我们可以随心所欲地改变arr2数组,而不会对原始的arr数组产生任何影响:

Var arr = ['a', 'b', 'c']; Var arr2 =[…arr]; arr2.push (' d '); console.log (arr);

同样,这是因为arr的值被展开以填充arr2数组定义的括号。因此,我们将arr2设置为等于arr的各个值,而不是像第一个例子中那样设置为对arr的引用。

奖励示例-字符串到数组

作为有趣的最后一个示例,您可以使用spread语法将字符串转换为数组。只需在一对方括号内使用spread语法:

var str = “hello”; var chars = [...p]; 控制台.log(字符);

其他回答

三个点代表ES6中的展开运算符。它允许我们在JavaScript中做很多事情:

连接数组 var shooterGames =['使命召唤','孤岛惊魂','生化危机']; var racingGames =['极品飞车',' gt赛车','Burnout']; Var游戏=[…]shooterGames……玩赛车); console.log(games) //['使命召唤','孤岛惊魂','生化危机','极品飞车',' gt赛车','Burnout'] 析构数组 var shooterGames =['使命召唤','孤岛惊魂','生化危机']; Var[首先,…剩余]= shooterGames; console.log(第一);//使命召唤 console.log(剩余的);//[《孤岛惊魂》、《生化危机》] 组合两个对象 var myCrush = { 名字:“萨琳娜”, middlename:“玛丽” }; Var lastname = '我的姓'; var myWife = { ……myCrush, 姓 } console.log (myWife);// {firstname: 'Selena', // midlename: 'Marie', // lastname: '我的姓'}

这三个点还有另一个用途,就是所谓的Rest参数,它可以将一个函数的所有参数作为一个数组。

作为数组的函数参数 函数fun1(…参数){ }

这是ES6的一个特性,在React中也使用了这个特性。请看下面的例子:

function Sum(x, y, z) {
   return x + y + z;
}
console.log(Sum(1, 2, 3)); // 6

如果我们最多有三个参数,这种方式很好。但是,如果我们需要添加,例如,110个参数。我们是否应该定义它们并逐个添加它们?

当然,有一种更简单的方法,叫做扩散。 而不是传递所有这些参数,你写:

function (...numbers){} 

我们不知道有多少参数,但我们知道有很多。

基于ES6,我们可以重写上面的函数如下所示,并使用它们之间的扩展和映射,使其变得简单如一块蛋糕:

let Sum = (...numbers) => {
    return numbers.reduce((prev, current) => prev + current);
}
console.log(Sum(1, 2, 3, 4, 5, 6, 7, 8, 9)); // 45

... 3个点代表JS中的展开运算符。

没有展开运算符。

let a = ['one','one','two','two'];
let unq = [new Set(a)];

console.log(a);
console.log(unq);

输出:

(4) ['one', 'one', 'two', 'two']
[Set(2)]

带有展开运算符。

let a = ['one','one','two','two'];
let unq = [...new Set(a)];

console.log(a);
console.log(unq);

输出:

(4) ['one', 'one', 'two', 'two']
(2) ['one', 'two']

对于那些想要简单快速理解这个问题的人:

首先,这不仅仅是React的语法。这是ES6中的扩展语法,它迭代(合并,添加等)数组和对象。点击这里阅读更多信息。

为了回答这个问题:

让我们想象你有这样的标签:

<UserTag name="Supun" age="66" gender="male" />

然后你这样做:

const user = {
  "name": "Joe",
  "age": "50"
  "test": "test-val"
};

<UserTag name="Supun" gender="male"  {...user} age="66" />

那么标签将等于这个:

<UserTag name="Joe" gender="male" test="test-val" age="66" />

因此,当你在React标签中使用spread语法时,它将标签的属性作为对象属性,与给定的对象用户合并(如果存在则替换)。此外,您可能已经注意到,它只替换属性之前,而不是属性之后。所以在这个例子中,年龄保持不变。

那三个点…不是React术语。这些是JavaScript ES6扩展操作符。这有助于在不影响原始数组的情况下创建一个新数组来执行深度复制。这也可以用于对象。

const arr1 = [1, 2, 3, 4, 5]
const arr2 = arr1 // [1, 2, 3, 4, 5]
/*
 This is an example of a shallow copy.
 Where the value of arr1 is copied to arr2
 But now if you apply any method to
 arr2 will affect the arr1 also.  
*/

/*
 This is an example of a deep copy. 
 Here the values of arr1 get copied but they 
 both are disconnected. Meaning if you
 apply any method to arr3 it will not
 affect the arr1.
 */
 const arr3 = [...arr1] // [1, 2, 3, 4, 5]