组合VS继承

作者: 编码的哲哲 | 来源:发表于2017-02-17 10:40 被阅读150次

React有很强大的组合机制,我们也建议你用组合的方式书写代码而不是和java等等思想一样用继承的方式写代码,这样你就可以将组件复用了。
在本章节,我们介绍了一些初学react的人会自然而言想到用继承去解决的问题,然后我们通过组合来解决它。

容器

诸如侧滑栏,对话框等等组件一开始并不知道它们包含了什么孩子节点,我们建议把children作为prop的一部分传递,并且将其直接输出:

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标签中的任何值都可以通过children传递给FancyBorder组件,一旦FancyBorder组件在div中渲染了传递过来的children,渲染完成的东西就被组件当作返回值输出。
上面的例子不具有普遍性,在大多是情况下你想要将自己的组件当作prop传递,在这种情况下,你可以自定义自己的属性,这个属性的值为你自己想要传递的组件,而不是使用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 这样的element在react中仅仅是一个对象,所以你可以把它们当作prop来传递。

特殊的组件

在有些时候,我们把一些组件当作另一些组件的特殊化组件,比如欢迎对话框就是对话框的一个特殊化组件。在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}!`);
  }
}

那么继承呢???

在Facebook中,我们使用数以千计的组件来构建我们的react应用,在工作中我们还没有找到用组合方式解决不了的问题。props和组合机制给予你在书写自定义组件时极大的方便。组件的prop的值可以是一个私有数值,element或者函数。如果你要重复使用没有UI的组件,我们建议你将其独立成一个javascript模块。这样其他组件就可以引用它当作一个函数,一个类或着一个对象,而不是继承它。

相关文章

  • 组合VS继承

    在Effective Java中明确有提到一种思想就是组合优先于继承。实际中我们可以这样理解,组合是把代码摊开,而...

  • 组合VS继承

    React有很强大的组合机制,我们也建议你用组合的方式书写代码而不是和java等等思想一样用继承的方式写代码,这样...

  • react 组合vs继承

    react 提倡使用组合而不是继承来复用代码,具体原因呢,我现在还不知道-_-!好,先看看什么情况下我们会用到组合...

  • java 组合VS继承

      在阅读Effective Java中的第16条时发现了一个有趣的机制或者说是模式,那就是组合(文中翻译为复用,...

  • React组合 vs 继承

    组合 React 有十分强大的组合模式。我们推荐使用组合而非继承来实现组件间的代码重用。有些组件无法提前知晓它们子...

  • (四)react组合 vs 继承

    React 有十分强大的组合模式。我们推荐使用组合而非继承来实现组件间的代码重用1、组件使用一个特殊的 child...

  • 10.组合vs继承

    1. 为什么不推荐使用继承? 虽然继承可以解决代码复用等的问题,但如果继承层次过深、过复杂,也会影响到代码的可维护...

  • React笔记11(组合 vs 继承)

    React具有强大的组合模型,我们建议使用组合而不是继承来复用组件之间的代码。 本章节中,将围绕几个React新手...

  • 九. React的组合 VS 继承(Composition vs

    React 拥有一个强大的组合模型,官网建议使用组合而不是继承以实现代码的重用。 一. 包含 一些组件在设计前无法...

  • react 文档学习

    1,组合 vs 继承JSX 标签中的所有内容都会作为一个 children prop 传递给 子 组件 少数情况下...

网友评论

    本文标题:组合VS继承

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