什么是…在这个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(字符);

其他回答

这些被称为价差。顾名思义,它的意思是把它的值放到那些数组或对象中。

如:

let a = [1, 2, 3];
let b = [...a, 4, 5, 6];
console.log(b);
> [1, 2, 3, 4, 5, 6]

它只是在JSX中以不同的方式为您定义道具!

它使用…ES6中的数组和对象操作符(对象1还不完全支持),所以基本上如果你已经定义了你的props,你可以通过这种方式将它传递给你的元素。

所以在你的例子中,代码应该是这样的:

function yourA() {
  const props = {name='Alireza', age='35'};
  <Modal {...props} title='Modal heading' animation={false} />
}

因此,您定义的道具现在分开了,并可以在必要时重用。

它等于:

function yourA() {
  <Modal name='Alireza' age='35' title='Modal heading' animation={false} />
}

以下是React团队对JSX中扩展操作符的引用:

JSX传播属性 如果您知道要放在组件上的所有属性 提前使用JSX是很容易的:

var component = <Component foo={x} bar={y} />;

如果你不知道你想要设置哪些属性,你可能会想稍后将它们添加到对象上:

var component = <Component />;
component.props.foo = x; // bad
component.props.bar = y; // also bad

这是一个反模式,因为这意味着我们不能帮你检查 正确的propTypes直到很久以后。这意味着你的propTypes 错误将以一个神秘的堆栈跟踪结束。 这些道具应该被认为是不可变的。改变道具对象 其他地方可能会导致意想不到的后果,所以理想情况下会是这样 在这一点上是一个冻结的物体。 现在你可以使用JSX的一个新特性,叫做扩展属性:

var props = {};
    props.foo = x;
    props.bar = y;
    var component = <Component {...props} />;

对象的属性被复制到 组件的道具。 您可以多次使用该属性,也可以将其与其他属性组合使用。 规范顺序很重要。稍后的属性覆盖 之前的。

var props = { foo: 'default' };
var component = <Component {...props} foo={'override'} />;
console.log(component.props.foo); // 'override'

奇怪的是什么…符号?…操作符(或展开操作符)在ES6中已经支持数组。也有 对象Rest和扩展属性的ECMAScript提案。我们 利用这些支持并有序地开发标准 在JSX中提供更清晰的语法。

向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(字符);

在React应用程序中传递道具是常见的做法。这样我们就可以将状态更改应用到子组件上,而不管它是纯的还是不纯的(无状态的还是有状态的)。在传递道具时,有时最好的方法是传递单个属性或整个属性对象。由于ES6中对数组的支持,我们得到了“…”符号,现在我们能够实现将整个对象传递给子对象。

将道具传递给子对象的典型过程如下所示:

var component = <Component foo={x} bar={y} />;

当道具数量很少时可以使用这种方法,但当道具数量过多时就无法管理了。当您不知道子组件中所需的属性,而典型的JavaScript方法是简单地设置这些属性并稍后绑定到对象时,此方法就会出现问题。这会导致propType检查和神秘堆栈跟踪错误的问题,这些问题没有帮助,并导致调试延迟。下面是这种做法的一个例子,以及不应该做的事情:

var component = <Component />;
component.props.foo = x; // bad
component.props.bar = y;

这样做可以达到同样的结果,但会取得更适当的成功:

var props = {};
props.foo = x;
props.bar = y;
var component = Component(props); // Where did my JSX go?

但不使用JSX spread或JSX,所以要将其循环回方程中,我们现在可以这样做:

var props = {};
props.foo = x;
props.bar = y;
var component = <Component {...props} />;

包含在“…props"是foo: x, bar: y.这可以与其他属性结合起来覆盖"…使用这种语法:

var props = { foo: 'default' };
var component = <Component {...props} foo={'override'} />;
console.log(component.props.foo); // 'override'

此外,我们还可以将其他属性对象复制到其他对象上,或者按以下方式组合它们:

var oldObj = { foo: 'hello', bar: 'world' };
var newObj = { ...oldObj, foo: 'hi' };
console.log(newObj.foo); // 'hi';
console.log(newObj.bar); // 'world';

或者像这样合并两个不同的对象(这还没有在所有react版本中使用):

var ab = { ...a, ...b }; // merge(a, b)

根据Facebook的react/docs网站,另一种解释是:

如果您已经将“props”作为对象,并且希望在JSX中传递它,则可以使用“…”作为SPREAD操作符来传递整个props对象。下面两个例子是等价的:

function App1() {
  return <Greeting firstName="Ben" lastName="Hector" />;
}



function App2() {
  const props = {firstName: 'Ben', lastName: 'Hector'};
  return <Greeting {...props} />;
}

在构建泛型容器时,扩展属性可能很有用。然而,它们也会使代码变得混乱,因为很容易将许多不相关的道具传递给不关心它们的组件。应该谨慎使用此语法。

传播算子!由于大多数人已经优雅地回答了这个问题,我想建议一个快速使用扩散操作符的方法列表:

…spread运算符对JavaScript中许多不同的常规任务都很有用,包括:

复制数组 连接或组合数组 使用数学函数 使用数组作为参数 向列表中添加项 在React中添加状态 结合对象 将NodeList转换为数组

查看文章了解更多细节。如何使用展开运算符。我建议你习惯它。有很多很酷的方法可以使用展开运算符。