之前有写过一些关于react的基础的Demo。现在说一说组件之间怎么通信。

github 上有相应的代码参考:https://github.com/RealAndMe/react-demo

1. 概念

React主要是用来构建用户界面的JavaScript库。它的特点:

  • 单向响应数据流
  • 组件。代码可以复用。
  • 高效。React是在虚拟DOM上进行操作然后渲染到真实DOM上的。
  • JSX。这是JavaScript的语法扩展。

2. React组件之间的通信

react 组件之间的交流可以分成 4 种:

  • 【父组件】向【子组件】传值
  • 【父组件】向【孙组件】传值
  • 【子组件】向【父组件】传值
  • 兄弟组件之间传值(没有任何嵌套关系的组件)

3. 数据从父组件到子组件

父组件给子组件传值,也就是子组件调用父组件。

var Father = React.createClass({render: function() {return (<div><Child01 name={this.props.name} /><Child02 site={this.props.site} /></div>);}
});var Child01 = React.createClass({render: function() {return (<h1>{this.props.name}</h1>);}
});var Child02 = React.createClass({render: function() {return (<a href={this.props.site}>{this.props.site}</a>);}
});ReactDOM.render(<Father name="父组件给子组件传参" site=" http://www.baidu.com" />,document.getElementById('contain')
);    

上述代码中,父组件是<Father />。有两个子组件<Child01 /> <Child02 /> 。父组件向子组件传值,子组件通过调用 this.props 来获取父组件的值。

查看(demo14)

还有另一个例子在 github 上的 demo14 中的 index2.html,也是关于数据从父组件传到子组件的。

4. 数据从父组件到孙组件

//父组件
var Father = React.createClass({getInitialState: function(){return {msg: "start"}},componentDidMount: function(){var t = this;setTimeout(function(){t.setState({msg: "end"});},1000);},render: function() {return (<div><Child msg={this.state.msg}/></div>);}
});
//子组件
var Child = React.createClass({render: function(){return(<div><h1>{this.props.msg}</h1><ChildChild {...this.props} /></div>)}
});
//孙组件
var ChildChild = React.createClass({render: function(){return(<h1>{this.props.msg}</h1>)}
})
ReactDOM.render(<Father />,document.getElementById("contain"));

上述代码中,是父组件向孙组件传参。通过 ...运算符 将父组件的信息,以更加简洁的方式传递给孙组件。上级组件 props 与 state 的改变,会导致组件本身及其子组件的生命周期改变。

查看(demo15)

注意: 如果组件嵌套层太深,那么 props 传值就变得没有那么高效。所以建议尽可能的减少组件的层次,结构简单清楚较好。

4. 数据从子组件到父组件

//父组件
var Father = React.createClass({getInitialState: function(){return {checked: false}},onCheck: function(newState){this.setState({checked: newState});},render: function() {var isCheck = this.state.checked?"yes":"no";return (<div><div>父组件的状态:{isCheck}</div><Child text="子组件勾选改变状态:"isCheck={this.state.checked}callFather={this.onCheck}/></div>);}
});
//子组件
var Child = React.createClass({getInitialState: function(){return{checked: this.props.inCheck};},onChangeState: function(){var newState = !this.state.checked;this.setState({checked : newState});//注意,需要调用父组件的方法实现数据从子组件传给父组件this.props.callFather(newState);},render: function(){//子组件从父组件获取值var text = this.props.text;//子组件自身的状态var checked = this.state.checked;return(<div>{text}<input type="checkbox" checked={checked} onClick={this.onChangeState}/></div>)}
});
ReactDOM.render(<Father />,document.getElementById("contain"));

上面介绍过,父组件可以通过 props 的方式,自上而下向子组件或是孙组件通讯,而子组件向父组件通讯也可以通过 props ,只是父组件传递的是作用域为父组件本身的函数,子组件调用该函数,将子组件需要传递的值作为参数,传给父组件的作用域中。

上述代码中,父组件 <Father /> 它本身有一个函数 onCheck() ,子组件 <Child /> 通过 this.props 调用该函数,然后将传递的信息通过 newState 作为参数传给父组件。

查看(demo16)

还有另一个例子在 github 上的 demo16 中的 index2.html,也是关于数据从子组件到父组件,不同的是,它是多个子组件调用同一个回调函数。

5. 兄弟组件之间传值

拥有同一个父组件,但是没有直接关联关系的两个组件就可以称之为兄弟组件。

比如有两个兄弟组件<Child01 /> <Child02 /> ,他们拥有同一个父组件 <Father /> ,如果我们由 <Child01 /><Child02 /> 进行通讯,那么我们可以通过 <Child01 /> 先向 <Father /> 通讯,然后通过 <Father /><Child02 /> 通讯。这种方法就是结合了上述的子组件和父组件之间的通讯 来完成的。

//父组件
var Father = React.createClass({getInitialState: function(){return{msg: "兄弟组件未更新"}},transferMsg: function(){this.setState({msg:"兄弟组件沟通成功"});},render: function(){return(<div><p>兄弟组件之间进行通讯</p><Child01 transferMsg={this.transferMsg}/><Child02 text={this.state.msg} /></div>)}
});
//子组件01
var Child01 = React.createClass({render: function(){return(<button onClick={this.props.transferMsg}>更新兄弟组件</button>)}
});
//子组件02
var Child02 = React.createClass({render: function(){return(<div>{this.props.text}</div>)}
});
ReactDOM.render(<Father />,document.getElementById("contain"));

上述代码中,<Child01 /> 通过 this.props 回调 <Father /> 中的 transferMsg() 函数方法,然后 <Father /> 将信息传递给 <Child02 />

查看(demo17)

有道云笔记参考http://note.youdao.com/noteshare?id=9905a9dc8d428c4e570a738279708a98&sub=6964AD2CE4C849C4A41A2749A69BB940

转载于:https://www.cnblogs.com/real-me/p/7158191.html

React组件之间的通信相关推荐

  1. 使用reflux进行react组件之间的通信

    前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...

  2. react 显示隐藏组件的方法_10种React组件之间通信的方法

    来源 | https://segmentfault.com/a/1190000023585646 这两天被临时抽调到别的项目组去做一个小项目的迭代.这个项目前端是用React,只是个小型项目所以并没有 ...

  3. React(5)React兄弟组件之间的通信

    文章目录 前言 一.兄弟组件之间的通信原理 二.三个组件的基本结构 1.子组件ColorSelector的基本结构 2.子组件ColorBoard的基本结构 3.父组件Color的基本结构 三.Col ...

  4. React(一)父子组件之间的通信

    无论是React,还是Vue,父子组件之间的通信都是组件式开发至关重要的一部分.备注一下基础要点. 1.父组件向子组件传值 父组件向子组件传值是在调用子组件的时候通过参数传递给子组件 .父组件代码 i ...

  5. react组件之间传递信息/react组件之间值的传递

    react组件之间传递信息/react组件之间值的传递 首先咱们先来了解一下,数据是怎么进行相互间传递的; api和组件的区别:一个是逻辑层的方法函数,一个是表现层的组件(方法函数). api是一组预 ...

  6. React组件之间传值

    前言 今天群里面有很多都在问关于 React 组件之间是如何通信的问题,之前自己写的时候也遇到过这类问题.下面是我看到的一篇不错英文版的翻译,看过我博客的人都知道,我翻译可能不会按部就班,会尽可能用中 ...

  7. 前端React教程第三课 数据是如何在 React 组件之间流动

    04 数据是如何在 React 组件之间流动的?(上) 通过前面 3 个课时的学习,相信你已经对 React 生命周期相关的"Why""What"和" ...

  8. vue中子组件和子组件之间怎么通信_vue.js组件之间如何通信?

    vue.js组件之间如何通信?下面本篇文章就来给大家介绍一下Vue.js组件间通信方式.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 平时在使用Vue框架的业务开发中,组件不仅仅要 ...

  9. React 组件之间传递参数

    其实react组件之间传递参数是比较简单的,但是没有具体的使用过,组件之间传递参数是比较常见的事情,所以记录一下,防止以后自己在网上胡乱的翻找 最近做了一个商品的列表页面,我想通过点击修改能够实现商品 ...

  10. [react] react组件间的通信有哪些?

    [react] react组件间的通信有哪些? Props Context ref:通过Ref获取组建的实例,在通过实例拿到组件的属性值或者方法的回调 第三方的,Redux是基于Conext基础上的库 ...

最新文章

  1. ▲我的css架构理念
  2. poi动态创建文档_POI创建的文档具有不同条件的灵活样式
  3. 黑马程序员---java基础------------------多线程
  4. Linux/Unix服务端和客户端Socket编程入门实例(含源码下载)
  5. Perl面向对象编程
  6. onload 事件、DOMContentLoaded事件、DOM加载顺序
  7. cartographer安装_【ROS-SLAM】Cartographer ROS官方文档翻译学习(1)——下载与安装...
  8. 我在使用Next.js, Antd, @zeit/next-css时遇到的一些问题
  9. PHP解密PHP加密sg11加密sg11解密全网最厚道的SG11解密方法sg11解密 php解密 SourceGuardian解密sg_load解密去除域名IP授权
  10. 服务器单核性能天梯图,台式机cpu性能排行(cpu单核性能天梯图)
  11. 人工智能在金融行业的应用
  12. Linux权限中x是什么意思,linux里的drwxr-xr-x代表的意思
  13. Android 中 使用 Google Paly 支付 简介
  14. 看论文时的几个数学术语
  15. C++——m个月饼分给n个人
  16. 10个深度学习的工具
  17. HTML5+CSS3小实例:黏性小球loading动画
  18. 如何利用CRM软件建立有利可图的客户关系?
  19. oracle 获取英文时间,javascript英文日期(有时间)选择器
  20. CDA1级习题复习(2)

热门文章

  1. php逻辑分析,PHP – 字符串逻辑分析 – “X和Y或Z”
  2. 机器人码垛搬运编程程序_一条指令搞定机器人搬运程序
  3. fisco bcos console控制台 调用合约报错 does not exist
  4. Mysiam锁模式 innodb锁模式 是什么区别
  5. FISCO BCOS Solidity 使用Table合约CRUD接口 智能合约例子
  6. 关于配置文件的几点常识
  7. Java面试题及答案2019_一般JAVA面试题及答案解析2019
  8. 树莓派 口罩识别 python_RaspberryPi上实现佩戴口罩识别——2020电赛F题小记
  9. 计算机/程序员常用英语(持续添加,包括一些简写)
  10. mysql ssh 导入时注意问题