...
在这个反应(使用JSX)代码中做了什么,它叫什么?
<Modal {...this.props} title='Modal heading' animation={false}>
最佳答案:
这就是财产价差符号。它是在ES2018中添加的,但在React项目中通过蒸腾作用长期得到支持(作为“JSX扩展属性”,即使您也可以在其他地方进行,而不仅仅是属性)。{...this.props}
将props
中的“own”属性作为要创建的Modal
元素的离散属性展开。例如,如果this.props
包含a: 1
和b: 2
,则
<Modal {...this.props} title='Modal heading' animation={false}>
会和
<Modal a={this.props.a} b={this.props.b} title='Modal heading' animation={false}>
但它是动态的,所以不管
props
中包含什么“自有”属性。由于
children
是props
中的“own”属性,因此spread将包括它。因此,如果出现的组件具有子元素,它们将被传递到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;
}