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生产批量批处理执行命令
Jul 28 Javascript
jQuery 行级解析读取XML文件(附源码)
Oct 12 Javascript
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
几个比较经典常用的jQuery小技巧
Mar 01 Javascript
Js,alert出现乱码问题的解决方法
Jun 19 Javascript
JS基于Ajax实现的网页Loading效果代码
Oct 27 Javascript
JavaScript实现数据类型的相互转换
Mar 06 Javascript
JS新包管理工具yarn和npm的对比与使用入门
Dec 09 Javascript
微信小程序-滚动消息通知的实例代码
Aug 03 Javascript
bootstrap实现二级下拉菜单效果
Nov 23 Javascript
vue在线动态切换主题色方案
Mar 26 Javascript
解决vue路由name同名,路由重复的问题
Aug 05 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统一页面编码避免乱码问题
2015/04/09 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
jquery tools系列 expose 学习
2009/09/06 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
Django如何重置migration的几种情景
2021/02/24 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
大学生毕业自我评价范文分享
2013/11/11 职场文书
会计职业生涯规划书
2014/01/13 职场文书
《小白兔和小灰兔》教学反思
2014/02/18 职场文书
《王二小》教学反思
2014/02/27 职场文书
高中军训感言800字
2014/03/05 职场文书
研讨会主持词
2014/04/02 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
市场督导岗位职责
2015/04/10 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
MySQL为id选择合适的数据类型
2021/06/07 MySQL
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL