React的基本组件元素是一个个组件,组件之间可能存在关联、组合等关系。不同的组件之间,经常会发生数据传递或者交换,我们称之为组件间通信。 根据传递的复杂程度,可以分为三种情况: 父子间通信,兄弟间通信,同其他外部库通信。

父子间通信

在学习组件的时候,props是输入,组件是输出。在这里的props,就是父向子传递的数据。而子向父传递数据,则是通过父级传递进来的props中的函数引用,间接的唤起父级处理函数,并传入参数。

/* 父组件 */
export default class NameInput extends Component {constructor(props) {super(props);this.state = {value: "default"};this.handleSubChange = this.handleSubChange.bind(this);}handleSubChange(newValue) {this.setState({ value: newValue });}render() {return (<div><div>{this.state.value}</div><Sub sub="sub1" subClick={this.handleSubChange} /></div>);}
}
复制代码
/* 子组件 */
export default class NameInput extends Component {constructor(props) {super(props);this.handleChange = this.handleChange.bind(this);}handleChange() {this.props.subClick("new sub");}render() {return <div onClick={this.handleChange}>{this.props.sub}</div>;}
}
复制代码

在这个例子里,通过调用props上传递进来的处理函数,达到了子向父传递数据的目的。

兄弟间通信

不使用其他库的话,借助React原生API,有两种方法:

通过父组件做中转 借用父组件以外,也可以使用react的Context API 关于Context API,我们还是先翻文档Context。

Context主要是为了处理多个组件可能需要获取同一组数据,例如文档中提到的theme,以及B端系统经常需要获取全局登录态,都可以使用ContextAPI。

在Context中,有两个重要的概念,Provider和Consumer。

Provider提供一个全局的数据源,订阅了它的数据源的Cusumer,不论节点嵌套多深都可以获取到Provider提供的数据。

看一个例子。

点我-CodeSandbox

在一些轻量级的应用中,基本上可以使用ContextAPI解决多级数据共享的问题。当然,如果要更强大,只能用Redux等库了。

关于Redux的使用,会在下一篇详细讲解。

同其他外部库通信

如果一个项目中,既有React,又有jQuery,又有Vue怎么办?怎么解决这种情形下得数据流转?

这是阿里的一道面试题,我那时没有怎么写过React,基本上就是zepto和小程序,面试官没有为难我,提了这样的问题。当时我提出了一种想法,发布订阅加适配器模式。下面简单说一下我的想法。

如果把这个场景抽象一下,可以看做是三种不同的组件需要相互通信,它们对数据的要求不一样,数据格式不同,但是一旦数据打到各自的组件内,其实数据流就不需要我们关心了。

所以可以维护一个公共的数据集市,所有人都从数据集市里取数据,也向数据集市中发数据,数据集市是一个公开的发布者,各组件为订阅者。

数据集市承担了适配的工作,对各个组件传进来的数据统一保存,在取数据时,根据组件的类型不同,派发不同形式的组件,这样,基本上就将组件间通信提升至了一个统一的数据集市,避免了组件的之间一对一通信。

当然,这和flux的思想也很类似,统一数据源,统一分发,只和数据源交互,避免了多个组件间复杂通讯带来的数据流混乱。

了解更多 本次给大家推荐一个免费的学习群,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。 对web开发技术感兴趣的同学,欢迎加入Q群:864305860,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

转载于:https://juejin.im/post/5c2a13a96fb9a049f43b690f

深入解析Vue组件间通信相关推荐

  1. Vue.js解析(十)【Vue组件间通信】

    什么是Vue组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊 ...

  2. Vue 组件间通信方法汇总

    Vue 组件间通信方法汇总 ⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅 除了使用 Vuex 方法外,vue 提供了各种各样的组件间通信的方案.文章整理一下父子组件.兄弟组件.祖先后代组件间 ...

  3. vue组件间通信六种方式

    vue组件间通信六种方式 组件之间的传值通信 组件之间的通讯分为三种:父传子.子传父.兄弟之间的通讯: props/$emit 父传子:主要是通过props来实现的 具体实现:父组件通过import引 ...

  4. vue组件间通信传递数据的四种方式(路由传参、父子组件传参、兄弟组件传参、深层次传参)

    前言: vue组件间通信对于经常来写vue的伙伴来说应该是很轻松的,对于一些刚入门的伙伴来说可能就有些迷茫,感觉方式有很多种,但是总结起来又不知道应该怎么说,在下面的文章中,我结合自己的开发过程中经常 ...

  5. Vue 组件间通信有哪几种方式

    Vue 组件间通信主要指以下 3 类通信:父子组件通信.隔代组件通信.兄弟组件通信 1.props / $emit 适用 父子组件通信 props是父组件将值传给子组件,$emit是子组件通过派发事件 ...

  6. vue组件间通信六种方式(完整版)

    前言   组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系:                如上图所示 ...

  7. 每日一道面试题:Vue 组件间通信有哪几种方式?

    Vue 组件间通信有哪几种方式? 父子组件通信.隔代组件通信.兄弟组件通信 (1)props / $emit适用 父子组件通信 - 这种方法是 Vue 组件的基础,相信大部分同学耳闻能详,所以此处就不 ...

  8. Vue 组件间通信几种方式(完整版)

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示,A 和 B.B 和 C.B 和 D 都是 ...

  9. vue组件间通信之兄弟组件通信(vue3.0$EventBus)

    vue组件间通信之兄弟组件通信(vue3.0$EventBus) vue组件中的数据传递最最常见的就是父子组件之间的传递.父传子通过props向下传递数据给子组件:子传父通过$emit发送事件,并携带 ...

最新文章

  1. GHOST WIN8 64位软件自选安装专业优化版 201307 V1.0
  2. MATLAB对函数做评估
  3. 再度冲刺“农村电商第一股”,汇通达还有什么法宝?
  4. 配置管理小报100629:我是项目组成员,事情比较急,按流程需要项目经理批准,但项目经理不在怎么办?...
  5. 从排序数组中删除重复项
  6. Python小练习1:.txt文件常用读写操作
  7. UINavigationViewController的backBarButtonItem设置技巧
  8. OpenSIPS替代VOS3000的方案
  9. ftp文件传输协议的匿名用户、系统用户的实现详解过程
  10. 从微软下载Vista Ultimate 中文旗舰版
  11. OpenGL学习笔记:GLAD和第一个窗口
  12. draw.io怎么安装在linux,Draw.io安装
  13. CAD/CASS依据等高线等距或随机加高程点插件(等高线等距加高程点、等高线随机加高程点、等高线手动加高程点)
  14. error: You have not concluded your merge (MERGE_HEAD exists).解决
  15. ssm电子族谱信息管理系统的设计与实现毕业设计-附源码161714
  16. luogu1968 美元汇率
  17. 腾讯视频解析,Java实现
  18. python正则表达式试题_正则表达式练习题
  19. 计算机文化教程实验基础知识,《计算机文化基础》课程实验教学大纲
  20. 与 SQL Server 2012 建立连接时出现与网络相关的或特定于实例的错误。

热门文章

  1. Db4o结合Linq、Lambda表达式的简单示例
  2. osc上一位哥们的 php编译参数
  3. 微软关于XP退役的进一步说明。
  4. 完全命令行.NET开发
  5. 利用DHCP,http,tftp,pxe实现批量自动化部署系统
  6. kubernetes集群网络配置方案——flannel部署
  7. EngJS(超轻量) 中数据双向绑定如何使用
  8. 2017年智能家居将从概念走进现实
  9. php实现input输入框失去焦点自动保存输入框的数据
  10. 改写URL的查询字符串QUERY_STRING(转)