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 相关文章推荐
jquery select(列表)的操作(取值/赋值)
Aug 06 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
Aug 24 Javascript
javascript学习笔记(九) js对象 设计模式
Jun 19 Javascript
JavaScript 用cloneNode方法克隆节点的代码
Oct 15 Javascript
代码触发js事件(click、change)示例应用
Dec 13 Javascript
深入理解javascript的执行顺序
Apr 04 Javascript
js的window.showModalDialog及window.open用法实例分析
Jan 29 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
Jun 18 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
Jun 02 Javascript
js实时获取窗口大小变化的实例代码
Nov 18 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
elementui实现预览图片组件二次封装
Dec 29 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中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
php+mysql写的简单留言本实例代码
2008/07/25 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
php session的应用详细介绍
2017/03/22 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
splice slice区别
2006/10/09 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
js捆绑TypeScript声明文件的方法教程
2018/04/13 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
Python内置函数之filter map reduce介绍
2014/11/30 Python
Python实现合并字典的方法
2015/07/07 Python
如何表示python中的相对路径
2020/07/08 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
高三历史教学反思
2014/01/09 职场文书
秋游活动策划方案
2014/02/16 职场文书
超市采购员岗位职责
2015/04/07 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
办公用品管理制度
2015/08/04 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书