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 相关文章推荐
js检测客户端不是firefox则提示下载
Apr 07 Javascript
css把超出的部分显示为省略号的方法兼容火狐
Jul 23 Javascript
javascript 字符串连接的性能问题(多浏览器)
Nov 18 Javascript
JavaScript 页面坐标相关知识整理
Jan 09 Javascript
JavaScript 面向对象的 私有成员和公开成员
May 13 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
Feb 05 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
Sep 03 Javascript
js简单的点击返回顶部效果实现方法
Apr 10 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
超全面的vue.js使用总结
Feb 12 Javascript
JS闭包经典实例详解
Dec 20 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 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
wordpress之wp-settings.php
2007/08/17 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
Ext面向对象开发实践(续)
2008/11/18 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
详解python中executemany和序列的使用方法
2017/08/12 Python
Java分治归并排序算法实例详解
2017/12/12 Python
Python函数和模块的使用总结
2019/05/20 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
机电一体化自荐信
2013/12/10 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
力克胡哲观后感
2015/06/10 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB