效果图

communication.gif

点击查看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组件通信技巧相关推荐

  1. React组件通信--props

    React组件通信 1.props接收数据 //index.js import App from "./App";ReactDOM.render(<App name='传递数 ...

  2. React组件通信-非父子组件间的通信

    文章目录 React非父子组件通信 小知识点的补充 Context应用场景 Context相关API Context使用流程 React非父子组件通信 在React中, 非父子组件传递是通过一个API ...

  3. React组件通信(父传子,子传父) - 前端

    父组件向子组件传值(通过props传值) 子组件: class Children extends Component{constructor(props){super(props);}render() ...

  4. react组件通信-逆战1913

    父组件向子组件通信 父组件: import React,{ Component } from "react"; import Childre from"./Childre ...

  5. React组件通信传值 父传子 子传父 兄弟组件传值

    一.父组件传递子组件 在父组件中引入子组件,将父组件的state值放到子组件标签中传递,在子组件中用this.props.传值名称,接收 父组件代码: import React, { Componen ...

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

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

  7. React组件(进阶--生命周期 )

    目录 一.生命周期 - 概述 二.生命周期 - 挂载阶段 三.生命周期 - 更新阶段 四.生命周期 - 卸载阶段 文章推荐: 1.JSX基础(入门) 2.React组件(入门) 3.React组件动状 ...

  8. Vue.js 父子组件通信的十种方式;告诉世界前端也能做 AI;你可能不知道的14个JavaScript调试技巧...

    记得点击文章末尾的"阅读原文"查看哟~ 下面先一起看下本周的摘要吧~ 想了解老用户如何参与阿里云双十一1折拼团特惠主机的,可以看第二条推送,文中提供了两种方法~,一起看看本周有哪些 ...

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

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

最新文章

  1. SQL-Hive中的Select From解析
  2. 文件/目录权限相关命令:chmod、chown、umask、lsattr/chattr命令解析
  3. 数据类型_插入数据_选取数据_修改数据——删除行
  4. 标准C++中的string类的用法总结(转)
  5. 如何判断一个点是否在三角形内部
  6. HNCU 1746: 算法4-1,4-3:定位子串
  7. [css] 能不能使用纯css使你的浏览器卡死?怎么实现?
  8. 在Delphi中如何创建和使用udl文件
  9. Python部分知识点
  10. python网站设计开题报告_网站设计开题报告范文精选5篇
  11. eval() python_python基础-input函数和eval函数
  12. listview中getview异步加载网络图片
  13. SFS2X客户端全部事件详细
  14. 创建一个带有Lookup字段的List
  15. jquery富文本编译器_jQuery 移动端artEditor富文本编辑器
  16. for linux pdf转mobi_在Linux上,如何为Amazon Kindle转换各种电子书格式
  17. fild与fmul的问题
  18. 计算机地质制图CAD,计算机辅助地质制图
  19. VHDL实验二::半加器、一位和四位全加器(绘制原理图)
  20. 基于iOS 10封装的下载器(支持存储读取、断点续传、后台下载、杀死APP重启后的断点续传等功能)

热门文章

  1. 【翻译】CEDEC2012 SQUARE ENIX GPGPU实现高速GI烘培工具的方法
  2. 【闲聊产品】之五:谁来背黑锅?
  3. SWFUpload上传
  4. 解决 Dynamics AX 2009 部署报表时错误
  5. 5G商用对视频会议市场增长具有积极意义
  6. 第39章 数据的并发处理
  7. es6 新增数据类型Symbol
  8. 给网页图标字体 Font Awesome 添加动画效果
  9. python使用selenium
  10. 如何安装Android SDK Emulator