React组件通信技巧
效果图
点击查看Github完整源码
1.父向子通信
- 直接标签中插入参数即可
//number只是个例子
let _number = this.state.number
<Child number={_number} />
需要注意,_number 可以为普通参数、this.xxx 参数、也可以是 this.state.xxx 参数,其中this.state.xxx参数若发生改变,会导致 Child 重新渲染
2.子向父通信
- 需要从 Parent 处接一个绑定了父组件的函数,然后在 Child 内部调用修改父的相关参数,达到效果
//从父组件接函数
childToParent() {
let _backNumber = this.state.backNumber
this.setState({
backNumber: _backNumber + 1
})
}
let _childToParent = this.childToParent.bind(this)
<Brother childToParent={_childToParent} />
<div>{'子向父通信:' + _backNumber}</div>
//子组件触发函数
let _childToParent = this.childToParent.bind(this)
<button onClick={_childToParent}>子向父通信</button>
同样,可以修改父组件的 this.state.xxx( this.setState() 触发渲染),也可以修改this.xxx等值
3.通用组件通信方式(包括兄弟组件)
理论上,掌握了子向父通信与父向子通信,可以处理兄弟组件通信,但是如果层级过深,这种方式极度麻烦
建议使用 Event 对象处理嵌套层级过深的组件通信(当然包括兄弟组件通信)
//建议将Event相关单独封装模块使用
//event.js
export var events = {
ctc: 'ctc',
ctp: 'ctp',
ptc: 'ptc',
bts: 'bts',
stb: 'stb'
}
export var sendEvent = (eventName, params) => {
var event = new Event(eventName)
event.params = params
document.dispatchEvent(event)
}
export var catchEvent = (eventName, callback) => {
document.addEventListener(eventName, e => callback(e))
}
export var removeCatch = (eventName, callback) => {
document.removeEventListener(eventName, callback)
}
//brother.js 发送组件
import {events, sendEvent} from './event'
<button onClick={_brotherToSister}>Brother向Sister通信</button>
brotherToSister() {
let _obj = {
message: 'brother to sister'
}
sendEvent(events.bts, _obj)
}
//sister.js 接收组件
import {events, catchEvent} from './event'
constructor() {
super()
this.state = {
message: ''
}
//防止多次引用
this._brotherToSister = this.brotherToSister.bind(this)
}
componentDidMount() {
catchEvent(events.bts, this._brotherToSister)
//会造成多次引用
// catchEvent(events.bts, this.brotherToSister.bind(this))
}
componentWillUnmount() {
removeCatch(event.bts, this._brotherToSister)
}
brotherToSister(e) {
this.setState({
message: e.params.message
})
}
<div>
{'message: ' + _message}
</div>
点击查看Github完整源码
React组件通信技巧的更多相关文章
- react第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参)
第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参) #课程目标 1.梳理react组件之间的关系 2.掌握父子传值的方法 3.掌握子父传值的方法 ...
- react组件通信那些事儿
父组件是调用组件的组件.现在看来,感觉父组件就是一个壳子,定义好壳子里面会有什么,而子组件是一个具体的实现,说明,会用到什么东西,如果有这些东西,会进行什么操作.总之,父组件是材料,有水和泥,子组件告 ...
- 21.react 组件通信
状态属性可以修改 this.setState()中可以写对象,也可以写方法 <script type="text/babel"> class Test extends ...
- React组件设计技巧
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- React/组件通信
组件通信可以分为以下几种: 父组件向子组件通信 子组件向父组件通信 跨级组件的通信及context 没有嵌套关系的组件通信 父组件向子组件通信 父组件通过props向子组件传递需要的信息. 子 ...
- React组件通信
1.父子通信 父 -> 子 props子 -> 父 回调函数,父组件通过props向子组件传递一个函数,子组件调用函数,父组件在回调函数中用setState改变自身状态 2.跨层级通信 1 ...
- 你不知道的React Developer Tools,20 分钟带你掌握 9 个 React 组件调试技巧
壹 ❀ 引 React Developer Tools 是 React 官方推出的开发者插件,可以毫不夸张的说,它在我们日常组件开发中,对于组件属性以及文件定位,props 排查等等场景都扮演者至关重 ...
- 使用reflux进行react组件之间的通信
前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...
- React之组件通信
组件通信无外乎,下面这三种父子组件,子父组件,平行组件(也叫兄弟组件)间的数据传输.下面我们来分别说一下: 父子组件: var Demo=React.createClass({ getInitialS ...
随机推荐
- JAVA中值类型和引用类型的不同(面试常考)
转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...
- 不同路径(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 问总共有多少条不同的路径?)
示例 1: 输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角. 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -&g ...
- sql语句中start with用法,用于表达一个复杂的目录树存储在一张表中
select * from tablename start with 条件1 connect by prior 条件2 where 条件3
- poj 2502 Subway【Dijkstra】
<题目链接> 题目大意: 某学生从家到学校之间有N(<200)条地铁,这个学生可以在任意站点上下车,无论何时都能赶上地铁,可以从一条地铁的任意一站到另一条地跌的任意一站,学生步行速度 ...
- Ubuntu ssh-keygen 生成公钥并添加到远程服务器上
1. 在本地生成公钥, ssh-keygen -t RSA -b 800 2. cd /root/.ssh 3. ssh-copy-id -i id_rsa.pub 远程服务器IP 这一步需要输入远 ...
- JS的异步世界
前言 JS的异步由来已久,各种异步概念也早早堆在开发者面前.可现实代码中,仍然充斥了各种因异步顺序处理不当的bug,或因不好好思考,或因不了解真相.今天,就特来再次好好探索一番JS的异步世界. 01 ...
- 开发环境之git:团队协作git工作流与常用命令
此篇文章只是一篇傻瓜式的,记录工作中比较规范且常见的一个git工作流需要用到的命令,让你可以快速的开始工作.而不是一些长篇大论的理论知识,如果你有用过sourcetree或者其它图形化工具,结合你正在 ...
- vim编辑器第二天
编辑模式的进入: i :在光标所在的字符前插入 a :在光标所在的字符后插入 o :在光标所在的行的下面一行插入 I : 在光标所在的行的行首插入,如果行首有空格则在空格后面开始插入 A :在光标 ...
- PHP学习笔记 ThinkPHP
//检测文件是否存在 if(!file_exists(dirname(__FILE__)."/Bo/Admin/Conf/config.php")) { header('Locat ...
- 伪类实现特殊图形,一个span加三角形
题目如图: 实现思路: 伪类+三边透明的三角形实现 代码: <span class="wei">wei</span> .wei{ display: inli ...