React组件之间的通讯

在 React 中,UI 以组件的形式来搭建,组件之间可以嵌套组合。另,React 中组件间通信的数据流是单向的,顶层组件可以通过 props 属性向下层组件传递数据,而下层组件不能向上层组件传递数据,兄弟组件之间同样不能。这样简单的单向数据流支撑起了 React 中的数据可控性。

然而在我们的开发中会有一些特殊的需求,需要子组件控制父组件的状态,或者无关系组件之间的通信。那么,更全面的组件间通信形式该怎么实现呢?

子父组件
需要父组件给子组件一个方法去修改自己的数据,子组件里边调用父组件的方法修改数据

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!-- 核心 -->
  <script src="../build/react.min.js"></script>
  <!-- 渲染dom -->
  <script src="../build/react-dom.min.js"></script>
  <!-- 把jsx、es6转换成js、es5 -->
  <script src="../build/browser.min.js"></script>
</head>
<body>
  <div id="root"></div>
</body>
<script type="text/babel">
  var Button = React.createClass({
    changeNumber:function () {
      this.props.add()
    },
    render:function () {
      return (
        <div>
          <p onClick={this.changeNumber}>子组件按钮++</p>
        </div>
      )
    }
  })
  var Box = React.createClass({
    getInitialState:function () {
      return{
        number:1
      }
    },
    addNumber:function () {
      this.setState({
        number:this.state.number+1
      })
    },
    render:function () {
      return (
        <div>
          <p>数量:{this.state.number}</p>
          <button onClick={this.addNumber}>按钮++</button>
          <Button add={this.addNumber}/>
        </div>
      )
    }
  })
  ReactDOM.render(<Box/>,document.getElementById("root"))
</script>
</html>

兄弟组件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!-- 核心 -->
  <script src="../build/react.min.js"></script>
  <!-- 渲染dom -->
  <script src="../build/react-dom.min.js"></script>
  <!-- 把jsx、es6转换成js、es5 -->
  <script src="../build/browser.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
<script type="text/babel">
  var Text = React.createClass({
    render:function () {
      return (
        <p>{this.props.children}</p>
      )
    }
  });
  var Btn = React.createClass({
    ChangeNumber:function () {
      this.props.add()
    },
    render:function () {
      return(
        <p onClick={this.ChangeNumber}>{this.props.children}</p>
      )
    }
  });
  var Box = React.createClass({
    getInitialState:function () {
      return{
        number:1
      }
    },
    addNumber:function () {
      this.setState({
          number:this.state.number+1
        }
      )
    },
    render:function () {
      return (
        <div>
          <Text>数量:{this.state.number}</Text>
          <Btn add={this.addNumber}>按钮</Btn>
        </div>
      )
    }
  });
  ReactDOM.render(<Box/>,document.getElementById("root"))
</script>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容