React组件之间的通信的实例代码


Posted in Javascript onJune 27, 2017

最近学习浅尝则止的学习了一下react.js这个UI的框架,react这个库给我的最大的感觉就是它能够完全的接管UI层,在要改变视图的东西的时候只需要改变其this.state中的状态。只要操作数据层的东西视图层就会发生变化,这一点我还是很喜欢的。可以摆脱对DOM的直接操作,毕竟直接来会比较复杂,本来应该是逻辑层js中混杂着各种css的字符串,对于我来说有点不爽(JSX中也混杂这标签,但我觉的不应该把它看作标签,看作语句会习惯一点)。

回到几天的重点,讲react组件之间的状态传递。

上代码:

1.定义两个子组件child-1和child-2

//child-1 子组件-1为输入框
  class Input extends React.Component{
   constructor(...args){
   super(...args);
   }
   render(){
    return <input type="text"/>
   }
  }
  //child-2  子组-2为显示框
  class Show extends React.Component{
   constructor(...args){
    super(...args);
   }
   render(){
    return <p></p>
   }

  }

2.定义父组件Parent并且将两个子组件插入到父组件中

class Parent extends React.Component{
   constructor(...args){
    super(...args);
   }
   render(){
    return(
     <div>
      <Input}/>
      <Show/>
     </div>
    );
   }
  }

现在的任务是在组件1总输入一些文字,同时在组件2中同时显示出来。

分析:要让组件2与组件1同步,就让组件1和2都去绑定父组件的状态。也就是说让两个组件受控。数据的走向是,组件1将自身的数据提升到父层,并且保存在父层的状态中。父层中的数据通过组件2中的props属性传递到组件2中,并在视图层进行绑定。

第一步先绑定<Show/>组件

//在父层中的constructor中定义状态为一个空的message,this.state = {message:''}
class Parent extends React.Component{
  constructor(...args){
   super(...args);
   this.state = {
    message:''
   }

然后在父组件中的<Show/>改为

<Show onShow={this.state.message}/>

接着来我们进入到<Show/>组件中,给其内容绑定这个穿件来的onShow属性。<Show/>组件变为

class Show extends React.Component{
  constructor(...args){
   super(...args);
  }
  render(){
   return <p>{this.props.onShow}</p>
  }

这样组件2显示层的数据已经绑定好了,接下来我们只要改变父亲层状态中的message的内容就可以使绑定的显示层的内容跟着一起变化

将输入层的状态(数据)提升到父亲组件中.下面是改写后的组件1

class Input extends React.Component{
  constructor(...args){
    super(...args);
  }
   //将输入的内容更新到自身组件的状态中,并且将改变后的状态作为参数传递给该组件的一个自定义属性onInp()
  fn(ev){ 
   this.props.onInp(ev.target.value);
  }
  render(){
   //用onInput(注意react中采用驼峰写法和原生的略有不同)绑定fn()函数
   return <input type="text" onInput={this.fn.bind(this)} value={this.props.content}/>
  }
 }

看到这里可能会有一个问题:onInp()和content没有啊?不要急,接着看

接着改写父组件中的输入层子组件1,

class Parent extends React.Component{
  constructor(...args){
   super(...args);
   this.state = {
    message:''
   };
  }
  //传进的text是其提升上来的状态,然后再更新父组件的状态
  fn(text){
   this.setState({
    message:text
   })
  }
  render(){
   return(
    <div>
      /*
       onInp就出现在这里,并绑定一个函数,
       并且有一个content将父组件的状态同步到子组件中
      */
     <Input onInp={this.fn.bind(this)} content={this.state.message}/> 
     <Show onShow={this.state.message}/>
    </div>
   );
  }
 }

写完的代码是这样的

// 父组
 class Parent extends React.Component{
  constructor(...args){
   super(...args);
   this.state = {
    message:''
   };
  }
  onInp(text){
   this.setState({
    message:text
   })
  }
  render(){
   return(
    <div>
     <Input onInp={this.onInp.bind(this)} content={this.state.message}/>
     <Show onShow={this.state.message}/>
    </div>
   );
  }
 }
 //child-1
 class Input extends React.Component{
  constructor(...args){
  super(...args);
  }
  fn(ev){
   this.props.onInp(ev.target.value);
  }
  render(){
   return <input type="text" onInput={this.fn.bind(this)} value={this.props.content}/>
  }
 }
 //child-2
 class Show extends React.Component{
  constructor(...args){
   super(...args);
  }
  render(){
   return <p>{this.props.onShow}</p>
  }

 }
 //最后渲染出
 ReactDOM.render(
  <Parent/>,
  document.getElementById('app')
 );

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Web开发者必备的12款超赞jQuery插件
Dec 03 Javascript
jQuery中创建实例与原型继承揭秘
Dec 21 Javascript
input禁止键盘及中文输入,但可以点击
Feb 13 Javascript
JavaScript中最简洁的编码html字符串的方法
Oct 11 Javascript
深入理解jQuery layui分页控件的使用
Aug 17 Javascript
EasyUI 结合JS导出Excel文件的实现方法
Nov 10 Javascript
Vue.js常用指令之循环使用v-for指令教程
Jun 27 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
Nov 22 Javascript
手动下载Chrome并解决puppeteer无法使用问题
Nov 12 Javascript
JS div匀速移动动画与变速移动动画代码实例
Mar 26 Javascript
微信小程序引入Vant组件库过程解析
Aug 06 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
Feb 11 Javascript
JS实现图片预览的两种方式
Jun 27 #Javascript
JavaScript转换数据库DateTime字段类型方法
Jun 27 #Javascript
JavaScript标准对象_动力节点Java学院整理
Jun 27 #Javascript
JavaScript闭包_动力节点Java学院整理
Jun 27 #Javascript
JavaScript创建对象_动力节点Java学院整理
Jun 27 #Javascript
JavaScript字符串_动力节点Java学院整理
Jun 27 #Javascript
JavaScript变量作用域_动力节点Java学院整理
Jun 27 #Javascript
You might like
php数组(array)输出的三种形式详解
2013/06/05 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
基于node.js的快速开发透明代理
2010/12/25 Javascript
JS继承 笔记
2011/07/13 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
小程序实现分类页
2019/07/12 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
python中常用的九种预处理方法分享
2016/09/11 Python
python矩阵的转置和逆转实例
2018/12/12 Python
详解python如何引用包package
2020/06/07 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
区域销售经理岗位职责
2013/12/10 职场文书
施工员岗位职责
2014/03/16 职场文书
遗嘱继承公证书
2014/04/09 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
2015年药店工作总结
2015/04/20 职场文书
在职证明格式样本
2015/06/15 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书