React拥有强大的组合模式,推荐使用组合而非继承来实现组件的代码复用。本章节也是以理解为主,重意不重力。
有些组件无法提前知晓它们子组件的具体内容。比如侧边栏、对话框等这类展示性的通用容器组件中特别容易遇到这种情况。这时,在构建组件时就可以利用props参数的一个特殊属性“children”,children属性就是将调用该组件实例所包含的JSX内容。如此,即可更加灵活。
function FancyBorder(props) {
return (
<div className={'FancyBorder FancyBorder-' + props.color}>
{props.children}
</div>
);
}
function WelcomeDialog() {
return (
<FancyBorder color="red">
<h1 className="Dialog-title">
Welcome
</h1>
<p className="Dialog-message">
反清复明
</p>
</FancyBorder>
);
}
ReactDOM.render(
<WelcomeDialog />,
document.getElementById('root')
);
少数情况下,需要同时包含不只一段JSX;这类情况可以不使用children属性,而是自行约定:将所需内容传入props,并使用相应的属性参数。示例如下:
function SplitPane(props) {
return (
<div className="SplitPane">
<div className="SplitPane-left">
{props.left}
</div>
<div className="SplitPane-right">
{props.right}
</div>
</div>
);
}
function App() {
return (
<SplitPane
left={
<Contacts />
}
right={
<Chat />
} />
);
}