开发者问题收集

React 中的这三个点起什么作用?

2015-06-25
651932

此 React(使用 JSX)代码中的 ... 起什么作用?它叫什么?

<Modal {...this.props} title='Modal heading' animation={false}>
3个回答

这就是 属性展开符号 。它是在 ES2018 中添加的(数组/可迭代对象的展开更早,ES2015),但它在 React 项目中通过转译长期得到支持(作为“ JSX 展开属性 ”,尽管您也可以在其他地方这样做,而不仅仅是属性)。

{...this.props> 展开 props 中的“自身”可枚举属性,作为您正在创建的 Modal 元素上的离散属性。例如,如果 this.props 包含 a: 1b: 2 ,则

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

将与

<Modal a={this.props.a} b={this.props.b} title='Modal heading' animation={false}>
相同>

但它是动态的,因此 props 中的任何“自身”属性都包括在内。

由于 childrenprops 中的“自身”属性,因此 spread 将包含它。因此,如果出现 this 的组件有子元素,它们将被传递给 Modal 。将子元素放在开始标记和结束标记之间只是语法糖——好的那种——用于将 children 属性放在开始标记中。示例:

class Example extends React.Component {
  render() {
    const { className, children } = this.props;
    return (
      <div className={className}>
      {children}
      </div>
    );
  }
}
ReactDOM.render(
  [
    <Example className="first">
      <span>Child in first</span>
    </Example>,
    <Example className="second" children={<span>Child in second</span>} />
  ],
  document.getElementById("root")
);
.first {
  color: green;
}
.second {
  color: blue;
}
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

展开表示法不仅适用于该用例,还适用于创建具有现有对象大多数(或所有)属性的新对象——这在更新状态时经常出现,因为您无法直接修改状态:

this.setState(prevState => {
    return {foo: {...prevState.foo, a: "updated"}};
});

这将用一个新对象替换 this.state.foo ,该新对象具有与 foo 相同的所有属性,但 a 属性除外,该属性变为 “updated”

const obj = {
  foo: {
    a: 1,
    b: 2,
    c: 3
  }
};
console.log("original", obj.foo);
// Creates a NEW object and assigns it to `obj.foo`
obj.foo = {...obj.foo, a: "updated"};
console.log("updated", obj.foo);
.as-console-wrapper {
  max-height: 100% !important;
}
T.J. Crowder
2015-06-25

... 被称为 扩展属性 ,顾名思义,它允许扩展表达式。

var parts = ['two', 'three'];
var numbers = ['one', ...parts, 'four', 'five']; // ["one", "two", "three", "four", "five"]

在本例中(我将简化它)。

// Just assume we have an object like this:
var person= {
    name: 'Alex',
    age: 35 
}

这个:

<Modal {...person} title='Modal heading' animation={false} />

等于

<Modal name={person.name} age={person.age} title='Modal heading' animation={false} />

所以简而言之,这是一个 简洁 的捷径, 我们可以说

Mehdi Raash
2017-01-13

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

  1. 连接数组

     var shooterGames = ['Call of Duty', 'Far Cry', 'Resident Evil'];
    var racingGames = ['Need For Speed', 'Gran Turismo', 'Burnout'];
    var games = [...shooterGames, ...racingGames];
    
    console.log(games) // ['使命召唤', '孤岛惊魂', '生化危机', '极品飞车', 'Gran Turismo', 'Burnout']
    
  2. 解构数组

     var shooterGames = ['使命召唤', '孤岛惊魂', '生化危机'];
    var [first, ...remaining] = shooterGames;
    console.log(first); //使命召唤
    console.log(remaining); //['孤岛惊魂', '生化危机']
    
  3. 合并两个对象

     var myCrush = {
    firstname: 'Selena',
    middlename: 'Marie'
    };
    
    var lastname = '我的姓氏';
    
    var myWife = {
    ...myCrush,
    lastname
    }
    
    console.log(myWife); // {firstname: 'Selena',
    // middlename: 'Marie',
    // lastname: '我的姓氏'}
    

这三个点还有另一种用途,称为 剩余参数 ,它使将所有参数作为一个数组传递给函数成为可能。

  1. 函数参数作为数组

     function fun1(...params) {
    
    }
    
theTypan
2018-06-06