集成 VS
继承
React
有强大的集成模快,并且在项目中推荐使用集成而不是继承
容器集成
在项目中有时候在渲染前父组件不知道他的子组件是什么,在这种情况下建议用props
的children
属性把子元素传递到父组件中
// 父组件
function FancyBorder(props) {
return (
<div className={'FancyBorder FancyBorder-' + props.color}>
{props.children}
</div>
);
}
调用父组件
注意:<FancyBorder><FancyBorder />
包裹的元素在父组件中以props.children
呈现
function WelcomeDialog() {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
Welcome
</h1>
<p className="Dialog-message">
Thank you for visiting our spacecraft!
</p>
</FancyBorder>
);
}
然而更多情况下,我们传递的子元素是分散的,这就需要自己定义会话方式了,而不是用children
function Contacts() {
return <div className="Contacts" />;
}
function Chat() {
return <div className="Chat" />;
}
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 />
只是普通的对象,所以可以像其他数据一样作为props
传递
个性化
有时候一个父组件可以做很多事情,而某个子组件只是它功能的一部分。各种子功能的组件互相调用,通过props
配置,也能实现各种各样的功能。这种调用在类
中也运行的很好。
示例:调用关系 SignUpDialog
<-- Dialog
<-- FancyBorder
function FancyBorder(props) {
return (
<div className={'FancyBorder FancyBorder-' + props.color}>
{props.children}
</div>
);
}
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}`);
}
}
ReactDOM.render(
<SignUpDialog />,
document.getElementById('root')
);