美文网首页
10.Composition vs Inheritance (组

10.Composition vs Inheritance (组

作者: 前端xiyoki | 来源:发表于2017-02-17 12:08 被阅读0次

    React版本:15.4.2
    **翻译:xiyoki **

    React具有强大的组合模型,我们建议使用组合而不是继承来在组件之间重用代码。在本节中,我们将考虑一些React新手常常遇到的开发继承的问题,并展示如何使用组合来解决它们。

    Containment(容器)

    一些组件提前并不知道它们的children。这对于类似** Sidebar Dialog 表示通用‘框’**的组件是特别常见的。
    我们建议这类框组件使用props.children来将子元素直接传递到它们的输出中:

    function FancyBorder(props) {  //抽象的框
      return (
        <div className={'FancyBorder FancyBorder-' + props.color}>
          {props.children}
        </div>
      );
    }
    

    这让其他组件通过JSX嵌套的方式传递任意的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>
      );
    }
    

    <FancyBorder>JSX开闭标签间的所有内容都作为children prop传递到FancyBorder组件中。由于FancyBorder在一个<div>标签中渲染 {props.children},被传递的子元素出现在最终的输出中。
    虽然不常见,但有时你可能需要在组件中有多个‘holes’。在这种情况下,你可以提出自己的约定,而不是使用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元素只是对象,因此你可以像传递其他数据那样,将它们作为props传递。

    Specialization(具象化)

    有时我们认为组件是其他组件的‘特殊情况’。例如,我们可以说a WelcomeDialog是一个特殊情况Dialog
    在React中,这也通过组合实现,其中更‘特定’的组件会渲染更‘通用’的组件,并且使用props配置通用组件:

    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}!`);
      }
    }
    

    So What About Inheritance?(那么继承呢)

    在Facebook,我们在数千的组件上应用React,并且我们没有发现任何用例要求我们建议创建组件继承层次结构。
    Props 和 组合给了你所有的灵活性,你需要以一个明确和安全的方式自定义组件的外观和行为。请记住,组件接受任意props,包括原始值、React元素或函数。
    如果要在组件之间重用非UI功能,建议你将其提取到单独的Javascript模块中。组件可以打人它,并使用该函数、对象或类,而不扩展它。

    相关文章

      网友评论

          本文标题:10.Composition vs Inheritance (组

          本文链接:https://www.haomeiwen.com/subject/gsnkwttx.html