美文网首页
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 (组

    React版本:15.4.2**翻译:xiyoki ** React具有强大的组合模型,我们建议使用组合而不是继承...

  • traits vs inheritance is that me

    Another difference with traits vs inheritance is that met...

  • Composition vs Inheritance

    Anything inside the JSX tag gets passed int...

  • 谈谈关于组合和继承

    组合大于继承(Composition over Inheritance)?这是一个问题。 继承是一个纵向的扩展,组...

  • 1组积分得分情况战斗力分析

    1、团队战绩:总分:一组439分VS二组446分;平均分:1组20.9分VS二组21.2分; 目前漫薇手迹青少年手...

  • Inheritance

    继承是swift中类区别于结构体和枚举等其他类型的主要原因。 子类可以调用或者重写父类的属性、方法和附属脚本。可以...

  • Inheritance

    Overriding Overriding Property Getters and Setters We can...

  • 当拉莫斯遇上C罗,我说平局

    文 / 负晚晴 今天,世界杯有3场比赛。A组1场,埃及VS乌拉圭。B组2场,摩洛哥VS伊朗,葡萄牙VS西班牙。 这...

  • 周末这样过

    上午公开课 vs 实验 下午 整理资料/跑步/晚餐 vs 实验/晚餐 晚上 处理事务 vs 组会汇报 上午 八点...

  • 1-多态

    1. 继承-inheritance 表达了实现的复用。inheritance 是从代码复用角度提出的概念,和类型没...

网友评论

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

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