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 相关文章推荐
如何用javascript判断录入的日期是否合法
Jan 08 Javascript
javascript web页面刷新的方法收集
Jul 02 Javascript
jquery EasyUI的formatter格式化函数代码
Jan 12 Javascript
javascript 弹出层组件(升级版)
May 12 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
Mar 03 Javascript
node.js文件上传处理示例
Oct 27 Javascript
Vue.js组件使用开发实例教程
Nov 01 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
JS实现电商放大镜效果
Aug 24 Javascript
微信小程序 Animation实现图片旋转动画示例
Aug 22 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
Sep 05 Javascript
JS使用for in有序获取对象数据
May 19 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常用函数的使用汇总
2013/06/08 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
jQuery冲突问题解决方法
2021/01/19 jQuery
[01:57]2018DOTA2亚洲邀请赛赛前采访-iG
2018/04/03 DOTA
python中cPickle用法例子分享
2014/01/03 Python
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
资金主管岗位职责范本
2014/03/04 职场文书
关于保护环境的建议书
2014/05/13 职场文书
公证委托书
2014/08/01 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
党员个人总结自评
2015/02/14 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python