首页 > 专栏 > 前端 > 文章详情
React 中的组合与继承 发布于:2021-03-22 11:40:09   来源:React   查看:3  讨论:0
初学者认识react,之前一直用继承完成功能复用。现在考虑,如何用组合来解决此问题?ivi易塔云建站-模板下载,web开发资源,技术博客
一、通过父-子包含完成prosp数值的传递。
function FancyBorder(props) {
  return (
      <div className={'FancyBorder FancyBorder-' + props.color}>
        {props.children}
      </div>
  );
}
通过children的方式,<FancyBorder> JSX 标签中的所有内容都会作为一个 children prop 传递给 FancyBorder 组件。ivi易塔云建站-模板下载,web开发资源,技术博客
因为 FancyBorder 将 {props.children} 渲染在一个 <div> 中,被传递的这些子组件最终都会出现在输出结果中。
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,而是自行约定:将所需内容传入 props,并使用相应的 prop。
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 />
          } />
  );
}
三、把一些组件看作是其他组件的特殊实例
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!" />
  );
}
四、同样也适应于class组件。
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}!`);
  }
}

评论

  • 匿名