第九单元(非父子通信 events 单向数据流)

#课程目标

  1. 了解非父子组件通信的原理,熟练实现非父子组件间的通信(重点)
  2. 了解单向数据流的含义,并且明白单向数据流的好处

#知识点

#1.非父子组件间的通信

​ 在昨天我们已经学习了父子间通信,子父间通信的实现方式,那么如果两个组件不是父子组件那么如何通信呢?

思考 Vue 中非父子组件通信的方法有哪些?

​ 常用的方法有 EventBus 和 Vuex(这里暂时先不讲vuex,之后章节将会单独讲解)

​ 那么我们通过EventBus来实现通信,这个EventBus是什么呢?

所谓EventBus就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。

更加具体的说法,通过实例化一个Vue对象( 比如bus = new Vue() )作为母线,在组件中通过事件将参数传递出去( bus.$emit(event, [...args]) ),然后在其他组件中再通过bus( 这里按照刚前面实例化Vue对象后的叫法 )来监听此事件并接受参数( bus.$on(event, callback) )

PS: 共用同一个Vue的实例( new Vue() ),通过此实例进行事件传递参数,在其他组件中监听此事件并且接收参数实现通信。

接下来将详细的讲解这个bus是如何通信的:

​ 假设我们在根组件$root中有两个兄弟组件,分别为A.vueB.vue,如果我们在A.vue有一个数据msg想要传递给B.vue

那么我们应该如何实现呢?

第一步:在根组件中实现实例化一个空的Vue对象,放到根组件中的data中。

  1. import Vue from 'vue'
  2. import App from './App'
  3. import router from './router'
  4. //实例化的空Vue对象
  5. var bus = new Vue();
  6. Vue.config.productionTip = false
  7. /* eslint-disable no-new */
  8. new Vue({
  9. el: '#app',
  10. router,
  11. render: h => h(App),
  12. //把bus放到根组件中的data中
  13. data:{
  14. bus:bus
  15. }
  16. })
 

那么这个时候,在任何子组件中通过this.$root.bus都能够访问到。

第二步:创建两个子组件,分别为Aa.vueBb.vue放到根组件中。

  1. //这里是根组件
  2. <template>
  3. <div>
  4. <Aa></Aa>
  5. <Bb></Bb>
  6. </div>
  7. </template>
  8. <script>
  9. import Aa from '@/components/A'
  10. import Bb from '@/components/B'
  11. export default {
  12. name: 'Ro',
  13. data () {
  14. return {
  15. msg:'我是Ro'
  16. }
  17. },
  18. mounted(){
  19. ////此处已经拿到了根组件中bus实例
  20. console.log(this.$root.bus)
  21. },
  22. components:{
  23. Aa,Bb
  24. }
  25. }
  26. </script>
 

第三步:想要Aa.vue传递数据给Bb.vue,那么就应该在Aa.vue中触发this.$root.bus.$emit()把相应的数据传递出去。

  1. <template>
  2. <div>
  3. {{msg}}
  4. <button @click="clickeMe">点击传个123给B</button>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'A',
  10. data () {
  11. return {
  12. msg:'我是A'
  13. }
  14. },
  15. methods:{
  16. clickeMe(){
  17. //点击触发bus的$emit事件
  18. this.$root.bus.$emit('sendmsg','123')
  19. }
  20. },
  21. mounted(){
  22. //此处已经拿到了根组件中bus实例
  23. console.log(this.$root.bus)
  24. },
  25. components:{}
  26. }
  27. </script>
 

第四步:想要Bb.vueAa.vue,那么就应该在Bb.vue中监听this.$root.bus.$on()把相应的数据传拿到当前组件中。

  1. <template>
  2. <div>
  3. {{msg}}
  4. --
  5. {{msg1}}
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'B',
  11. data () {
  12. return {
  13. msg:'我是B',
  14. msg1:'我是B未改变的数据'
  15. }
  16. },
  17. mounted(){
  18. //此处已经拿到了根组件中bus实例
  19. console.log(this.$root.bus)
  20. //此处监听Aa.vue传递过来的参数 并且赋值给当前组件的 msg1
  21. this.$root.bus.$on('sendmsg',(data)=>{
  22. this.msg1 = data;
  23. })
  24. },
  25. beforeDestroy(){
  26. //在组件销毁时别忘了解除事件绑定
  27. this.$root.bus.$on('sendmsg');
  28. }
  29. }
  30. </script>
 

这样就可以了,是不是很简单?

如果有多个组件组件需要通信,是不是要在根组件上多建几个bus

这个当然不需要的,只要保证事件名(eventName)不一样就行了。

为什么要弄个 bus?直接this.$root.$onthis.$root.$emit不更简单粗暴?

因为专门用一个空的 Vue 实例(bus)来做中央事件总线更加清晰也易于管理。

#2.单向数据流

为什么是单向数据流?

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

这里有两种常见的试图改变一个 prop 的情形:

  1. 这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data 属性并将这个 prop 用作其初始值:

    1. props: ['initialCounter'],
    2. data: function () {
    3. return {
    4. counter: this.initialCounter
    5. }
    6. }
     
  2. 这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

    1. props: ['size'],
    2. computed: {
    3. normalizedSize: function () {
    4. return this.size.trim().toLowerCase()
    5. }
    6. }
     

#授课思路

#案例和作业

使用EventBus的非父子组件方式,实现两个兄弟组件间的数据双向绑定。

vue第九单元(非父子通信 events 单向数据流)的更多相关文章

  1. Vue 组件&组件之间的通信 之 单向数据流

    单向数据流:父组件值的更新,会影响到子组件,反之则不行: 修改子组件的值: 局部数据:在子组件中定义新的数据,将父组件传过来的值赋值给新定义的数据,之后操作这个新数据: 如果对数据进行简单的操作,可以 ...

  2. vue之非父子通信

    一.非父子通信: 思路: 找个中间存储器,组件一把信息放入其中,组件二去拿 代码如下: let hanfei = new Vue();  # 实列化个空的vue对象,作为中间存储器来时间        ...

  3. vue.js 创建组件 子父通信 父子通信 非父子通信

    1.创建组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  4. Vue兄弟组件(非父子组件)状态共享与传值

      前言:网上大部分文章写的有点乱,很少有讲得易懂的文章. 所以,我写了篇在我能看得懂的基础上又照顾到大家的文章 =.= 作者:X1aoYE 备注:此文原创,转载请注明~  内容里的<br> ...

  5. NO17--vue父子组件间单向数据流的解决办法

    在上一篇中讲解了父子组件之间是如何传值的,如果子组件需要改变传过来的数据供自己使用,或者想在子组件中改变传过来的数据并同步到父组件,那么直接改肯定是不行的,如果你这么做了,Vue 会在控制台给出警告. ...

  6. Vue 非父子组件通信方案

    Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...

  7. vue父子组件及非父子组件通信

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...

  8. Vue父子组件及非父子组件如何通信

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: 子组件通过props来接收数据: 方式1: 方式2 : 方式3: 这样呢,就实现了父组件向子组件传递数 ...

  9. Vue 非父子组件通信

    组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...

随机推荐

  1. mysql官网下载yum

    1.进入mysql官网 2.下载页面最下方的社区下载 3.找到yum库 下载: 7.安装.rpm[root@test tools]# rpm -ivh mysql80-community-releas ...

  2. MathType颜色设置的技巧

    MathType功能非常强大,在编辑公式时使用非常方便.运用MathType不仅可以改变公式的字体和字号,也可以改变公式字体颜色,MathType颜色设置还是有一套技术的,下面我们就一起来看看公式编辑 ...

  3. 需要登录才能下载的文件可以用Folx下载吗

    用苹果电脑的小伙伴有没有发现,有时候文件即时有下载链接也还是要先登录才能下载,那这样的文件用下载器Folx还能下载码?下面小编将在Mac系统平台上,通过一篇教程教大家利用Folx 5的密码管理来保存网 ...

  4. selenium WebDriver提示Unable to find a matching set of capabilities解决方法

    问题出在:应该将火狐浏览器驱动添加到火狐浏览器安装目录下,并且将火狐浏览器安装目录放在path下面.(出现大意,忘了在火狐浏览器下放其对应的驱动) 亲测以下组合方式可用:   pycharm-comm ...

  5. 合并2个数组为1个无重复元素的有序数组--Go对比Python

    Go实现: 1 package main 2 3 import ( 4 "fmt" 5 "sort" 6 ) 7 8 func main() { 9 var a ...

  6. Bootstrap Blazor 组件介绍 Table (二)自定义模板列功能介绍

    Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...

  7. 排序--MergeSort 归并排序?

    MergeSort 's implementation MergetSort 的中心思想就是分治思想,通过解决每一个小问题来解决大问题 假设你有2个已经排好序的数组 数组[ 4 ][ 8 ] 和 数组 ...

  8. Linu之用户管理【useradd】【userdel】【usermod】【passwd】【权限】

    linux下创建用户 1.用户的创建 • 简介 linux是一个多用户多任务的分时操作系统,每个用户都是在root下的一个子用户,拥有不同的权限.用户登入成功后可进入系统和自己的主目录. •实现账号的 ...

  9. CAD插件

    CAD插件使用: 1.首先得有插件,插件解压,放那个盘都可以,只要自己觉得放得下,注:(每次打开CAD想要用插件都要的步骤)打开CAD---AP回车----找到插件所在文件夹-------Ctrl+A ...

  10. 区块链知识博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    注:这是本人读到的关于共识算法最全和最好的分享博文,系统的介绍了拜占庭容错技术以及共识算法的原理和常用共识算法,原文链接请见后. 目录 一.拜占庭容错技术(Byzantine Fault Tolera ...