React从入门到精通系列之(11)组合VS继承
十一、组合 VS 继承React具有强大的组合模式,我们建议使用组合而不是继承来重用组件之间的代码。 在本节中,我们将考虑一些新的React常常遇到的开发继承的问题,并展示如何使用组合来解决它们。 有容乃大一些组件提前不知道它们的子组件是什么的。 这对于像 function FancyBorder(props) { return ( <div className={'FancyBorder FancyBorder-' + props.color}> {props.children} </div> ); } 这让其他组件通过嵌套JSX传递任意到他们的 function WelcomeDialog(props) { return ( <FancyBorder color="blue"> <h1 className="Dialog-title"> Welcome </h1> <p className="Dialog-message"> 感谢参观鹏寰国际大厦 </p> </FancyBorder> ); } 最终的html结构为: <div id="root"> <div data-reactroot="" class="FancyBorder FancyBorder-blue"> <h1 class="Dialog-title">Welcome</h1> <p class="Dialog-message">感谢参观鹏寰国际大厦</p> </div> </div> 任何在 虽然这不常见,有时你可能需要在组件中有多个 import React from 'react'; import ReactDOM from 'react-dom'; function Contacts() { return <h1>tel:182012322**</h1> } function Chat() { return <span>chat content</span> } function SplitPanel(props) { return ( <div className="SplitPane"> <div className="SplitPane-left"> {props.left} </div> <div className="SplitPane-right"> {props.right} </div> </div> ) } function App() { return ( <SplitPanel left={<Contacts />} right={<Chat />}/> ); } ReactDOM.render( <App />,document.getElementById('root') ); 像 用的专业一点有时我们认为某个组件是其他组件的 在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(props) { return ( <Dialog title="Welcome" message="欢迎参观鹏寰国际大厦" /> ); } 组合对于定义为类的组件同样有效: import React from 'react'; import ReactDOM from 'react-dom'; 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') ); 关于继承在Facebook,使用了React在数千个组件,他们没有发现一个必须实现组件继承层次结构的用例。 props和组合给你所有的灵活性,你需要以一个明确和安全的方式自定义组件的外观和行为。 请记住,组件可以接受任意props,包括原始值,React元素或函数。 如果要在组件之间重用非UI功能,建议您将其提取到单独的JavaScript模块中。 组件可以导入它并使用该函数,对象或类,而不扩展它。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |