文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
组合与 props.children
React 具有强大的组合模型,我们建议使用组合而不是继承来复用组件之间的代码。
在本节中,我们将围绕几个 React 新手经常使用继承解决的问题,我们将展示如何用组合来解决它们。
包含关系
一些组件不能提前知道它们的子组件是什么。这对于 Sidebar
或 Dialog
这类通用容器尤其常见。
我们建议这些组件使用 children
属性将子元素直接传递到输出。
function FancyBorder(props) {
return (
<div className={'FancyBorder FancyBorder-' + props.color}>
{props.children}
</div>
);
}
这样做还允许其他组件通过嵌套 JSX 来传递子组件。
function WelcomeDialog() {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
Welcome
</h1>
<p className="Dialog-message">
Thank you for visiting our spacecraft!
</p>
</FancyBorder>
);
}
<FancyBorder>
JSX 标签内的任何内容都将通过 children
属性传入 FancyBorder
。由于 FancyBorder
在一个 <div>
内渲染了 {props.children}
,所以被传递的所有元素都会出现在最终输出中。
虽然不太常见,但有时你可能需要在组件中有多个入口,这种情况下你可以使用自己约定的属性而不是 children
:
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 />
} />
);
}
类似 <Contacts />
和 <Chat />
这样的 React 元素都是对象,所以你可以像任何其他元素一样传递它们。
特殊实例
有时我们认为组件是其他组件的特殊实例。例如,我们会说 WelcomeDialog
是 Dialog
的特殊实例。
在 React 中,这也是通过组合来实现的,通过配置属性用较特殊的组件来渲染较通用的组件。
function Dialog(props) {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
{props.title}
</h1>
<p className="Dialog-message">
{props.message}
</p>
</FancyBorder>
);
}
function WelcomeDialog() {
return (
<Dialog
title="Welcome"
message="Thank you for visiting our spacecraft!" />
);
}
组合对于定义为类的组件同样适用:
function Dialog(props) {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
{props.title}
</h1>
<p className="Dialog-message">
{props.message}
</p>
{props.children}
</FancyBorder>
);
}
class SignUpDialog extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.handleSignUp = this.handleSignUp.bind(this);
this.state = {login: ''};
}
render() {
return (
<Dialog title="Mars Exploration Program"
message="How should we refer to you?">
<input value={this.state.login}
onChange={this.handleChange} />
<button onClick={this.handleSignUp}>
Sign Me Up!
</button>
</Dialog>
);
}
handleChange(e) {
this.setState({login: e.target.value});
}
handleSignUp() {
alert(`Welcome aboard, ${this.state.login}!`);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论