JSX 传播属性
Spread Attributes 是一个 JSX 特性。它是将对象的所有属性作为 JSX 属性传递的语法糖。
这两个例子是等价的。
// props written as attributes
<main className="main" role="main">{children}</main>
// props "spread" from object
<main {...{className: "main", role: "main", children}} />
使用它转发props
到底层组件。
const FancyDiv = props =>
<div className="fancy" {...props} />
现在,我可以期望FancyDiv
添加它关注的属性以及它不关注的属性。
<FancyDiv data-id="my-fancy-div">So Fancy</FancyDiv>
// output: <div className="fancy" data-id="my-fancy-div">So Fancy</div>
请记住,顺序很重要。如果props.className
被定义,它会破坏className
由FancyDiv
<FancyDiv className="my-fancy-div" />
// output: <div className="my-fancy-div"></div>
我们可以FancyDiv
通过将 s className 放在 spread props 之后使它始终“获胜” ({...props})
。
// my `className` clobbers your `className`
const FancyDiv = props =>
<div {...props} className="fancy" />
你应该优雅地处理这些类型的props。在这种情况下,我会将作者的props.className
与className
需要的样式合并到我的组件中。
const FancyDiv = ({ className, ...props }) =>
<div
className={["fancy", className].join(' ')}
{...props}
/>
解构和传播属性
通常在组合组件时,我们可能希望将父组件的大部分 props 传递给子组件,但不是全部。将 ES6+ 解构与 JSX 扩展属性相结合,无需仪式就可以实现:
class AutoloadingPostsGrid extends React.Component {
render() {
const {
className,
...others // contains all properties of this.props except for className
} = this.props;
return (
<div className={className}>
<PostsGrid {...others} />
<button onClick={this.handleLoadMoreClick}>Load more</button>
</div>
);
}
}