React中最重要的就是组件了,组件之间可以嵌套使用,那么,父组件和子组件之间,如何进行通信呢?
下面用一个例子记录React中组件之间的通信,因为组件中包含有属性和状态两个对象,所以组件间的通信,主要通过这两个对象来完成。
父组件给子组件通信,可以直接使用props,让父组件传递给子组件一个属性,子组件拿到这个属性即可;
子组件给父组件通信,也需要用到props,不过这个就有点类似于回调函数了,即父组件传给子组件一个函数,这个函数存在于父组件中,子组件通过回调这个函数,来让父组件做相应的操作,下面是一个父子组件互相通信的Demo,在浏览器中运行的效果如下图:
在父组件的输入框中输入内容后,该内容会同步显示到子组件中,或者在子组件的输入框中输入内容,该内容会同步显示到父组件中,如下图所示:
下面贴上这个Demo的代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>组件的嵌套和通信</title> <!-- 引入React需要用到的js文件 --> <script type="text/javascript" src="../react-0.13.0/build/react.js"></script> <script type="text/javascript" src="../react-0.13.0/build/JSXTransformer.js"></script> <!-- 这里是组件用到的css样式 --> <style type="text/css"> .parentComponent { width: 400px; height: 500px; border-style: solid; border-width: 1px; background-color: #6699ff; } .childComponent { width: 350px; height: 300px; margin-left: 25px; border-style: solid; border-width: 1px; background-color: #00aaaa; } .title { padding: 10px 0px 10px 0px } </style> </head> <body> <div id="container"></div> <script type="text/jsx"> //定义父组件 var ParentComponent = React.createClass({ getInitialState: function() { return { parentInput: '', //父组件的输入框中的内容 childInput: '', //子组件的输入框中的内容 onChange: this.handleChange //传给子组件,用于监听子组件输入框内容改变的函数 }; }, //处理父组件和子组件的输入框内容改变的事件,isParent用于区分是父组件还是子组件 handleChange: function(isParent, event) { if(isParent) { //是父组件输入框内容发生变化,则修改state,让子组件的输入框跟着改变,注意state的改变,会导致组件重新渲染 this.setState({parentInput: event.target.value}); }else{ //是子组件输入框,则修改state,让父组件的输入框跟着改变 this.setState({childInput: event.target.value}); } }, render: function() { return ( <div className="parentComponent"> <div className="title" style={{width: '400px', backgroundColor: '#ececec'}}>我是父组件</div> <br/> <input type="text" onChange={this.handleChange.bind(this, true)} style={{width: '350px', height: '30px', marginLeft: '25px'}} placeholder="在这里输入的文本,将显示到子组件中"/> <br/><br/> <input type="text" disabled="disabled" value={this.state.childInput} style={{width: '350px', height: '30px', marginLeft: '25px'}} placeholder="子组件中输入的文本,将显示在这里"/> <br/><br/> <ChildComponent data={this.state}/> </div> ); } }); //定义子组件 var ChildComponent = React.createClass({ render: function() { return ( <div className="childComponent"> <div className="title" style={{width: '350px', backgroundColor: '#ececec'}}>我是子组件</div> <br/> <input type="text" disabled="disabled" style={{width: '300px', height: '30px', marginLeft: '25px'}} placeholder="父组件中输入的内容,将显示在这里" value={this.props.data.parentInput}/> <br/><br/> <input type="text" onChange={this.props.data.onChange.bind(this, false)} style={{width: '300px', height: '30px', marginLeft: '25px'}} placeholder="在这里输入的文本,将显示到父组件中"/> <br/><br/> </div> ); } }); React.render(<ParentComponent />, document.getElementById('container')); </script> </body> </html>