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 相关文章推荐
25个优雅的jQuery Tooltip插件推荐
May 25 Javascript
浏览器兼容console对象的简要解决方案分享
Oct 24 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
Sep 02 Javascript
Jquery日期选择datepicker插件用法实例分析
Jun 08 Javascript
移除AngularJS下URL中的#字符的方法
Jun 19 Javascript
javascript顺序加载图片的方法
Jul 18 Javascript
JQuery手速测试小游戏实现思路详解
Sep 20 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
Nov 15 Javascript
使用Vue完成一个简单的todolist的方法
Dec 01 Javascript
layui自己添加图片按钮并点击跳转页面的例子
Sep 14 Javascript
小程序实现投票进度条
Nov 20 Javascript
Vue 列表页带参数进详情页的操作(router-link)
Nov 13 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远程采集图片详细教程
2014/07/01 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
动态添加删除表格行的js实现代码
2014/02/28 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
关于Django外键赋值问题详解
2017/08/13 Python
在Python中执行系统命令的方法示例详解
2017/09/14 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
如何设置Java的运行环境
2013/04/05 面试题
SQL面试题
2013/04/30 面试题
保护环境演讲稿
2014/05/10 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
五年级学生期末评语
2014/12/26 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
会议营销主持词
2015/07/03 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
HTML+JS实现在线朗读器
2022/02/15 Javascript