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 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
javascript,jquery闭包概念分析
Jun 19 Javascript
jquery中的事件处理详细介绍
Jun 24 Javascript
JavaScript全排列的六种算法 具体实现
Jun 29 Javascript
使用mouse事件实现简单的鼠标经过特效
Jan 30 Javascript
让JavaScript中setTimeout支持链式操作的方法
Jun 19 Javascript
Backbone.js框架中Model与Collection的使用实例
May 07 Javascript
JavaScript中Number对象的toFixed() 方法详解
Sep 02 Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
Vue组件和Route的生命周期实例详解
Feb 10 Javascript
微信小程序实现保存图片到相册功能
Nov 30 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
BBS(php &amp; mysql)完整版(二)
2006/10/09 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
js分页代码分享
2014/04/28 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
原生js+css实现tab切换功能
2020/09/17 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
python对html代码进行escape编码的方法
2015/05/04 Python
自己使用总结Python程序代码片段
2015/06/02 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
大学生毕业自我评价范文分享
2013/11/11 职场文书
个人思想理论学习的自我鉴定
2013/11/30 职场文书
安全检查验收制度
2014/01/12 职场文书
调研座谈会发言材料
2014/08/23 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书