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的反射问题
Apr 07 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
Oct 06 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
Jan 28 Javascript
jQuery Validate表单验证入门学习
Dec 18 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
JavaScript中省略元素对数组长度的影响
Oct 26 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
Oct 27 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
Mar 13 Javascript
判断“命令按钮”是否被鼠标单击详解
Jul 31 Javascript
vue内置组件component--通过is属性动态渲染组件操作
Jul 28 Javascript
三步搞定:Vue.js调用Android原生操作
Sep 07 Javascript
关于JavaScript轮播图的实现
Nov 20 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
Aptana调试javascript图解教程
2009/11/30 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
详解K-means算法在Python中的实现
2017/12/05 Python
Python遍历numpy数组的实例
2018/04/04 Python
pycharm安装和首次使用教程
2018/08/27 Python
python随机数分布random测试
2018/08/27 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
财经学院自荐信范文
2014/02/02 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
优秀员工获奖感言
2014/03/01 职场文书
贷款委托书怎么写
2014/08/02 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
机关保密工作承诺书
2015/05/04 职场文书
企业财务管理制度范本
2015/08/04 职场文书
详解Python描述符的工作原理
2021/06/11 Python
SQL SERVER触发器详解
2022/02/24 SQL Server