• 总结一下 vue2 组件之间的通信


    start

    • 最近在学习 vue3,在学习 vue3 的 之前。先总结一下,vue2 中的组件之间的通信;

    以下示例皆为 vue2

    1.父组件传值给子组件,利用 props

    父组件 app.vue

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    子组件 boxA.vue

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2.子组件和父组件通信 $emit

    父组件 app.vue

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    子组件 boxA.vue

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3. 跨多级组件通信

    /*新建一个Vue实例作为中央事件总线*/
    let event = new Vue()
    ​
    /*监听事件*/
    event.$on('eventName', (val) => {
      //......do something
    })
    ​
    /*触发事件*/
    event.$emit('eventName', 'this is a message.')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.跨多级组件数据通信

    vuex4.

    5. 父-》子-》孙 三个层级之间的组件通信 $attrs $listeners

    有这么一个场景,组件 A 中有组件 B,组件 B 中有 C。AC 之间通信怎么办?

    • 使用父子通信,B 组件中会有很多冗余代码。
    • 使用事件总线,不太利于管理;
    • 使用 vuex,有点大材小用;

    在 vue2.4 版本之后,添加了这么几个属性:

    • $attrs
    • $listeners

    $attrs

    • vm 上的属性。所以我们可以直接在组件中,this.$attrs打印出来;
    • 2.4.0 新增的属性;
    • 简单理解就是一个对象。所有父组件传递给子组件的值,当子组件没有用 prop 属性接收,就会存储在this.$attrs中。(class 和 style 除外)

    在这里插入图片描述

    $listeners

    • vm 上的属性。所以我们可以直接在组件中,this.$listeners打印出来;
    • 2.4.0 新增的属性;
    • 简单理解就是一个对象。所有父组件给子组件绑定到事件会存储在this.$listeners中,(不含 .native 修饰器的)

    有什么用?

    想象我们的场景:

    1. A 组件和 C 组件通信;
    2. A 传递数据给 B,绑定事件到 B 上。
    3. 可以在 B 中通过 this.$attrsthis.$listeners 拿到数据和事件
    4. 一起传递给 C 组件。

    例如:

    父组件 app.vue

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    子组件 boxA.vue

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    另外说个其他的小 tips

    • 没有被 父组件传递给子组件的值,如果没有被 props 接受。 默认会展示在 html 的标签上

    在这里插入图片描述

    可使用 inheritAttrs: false, 隐藏

  • 相关阅读:
    JVM第一讲:JVM相关知识体系详解+面试(P6熟练 P7精通)
    常用xshell中使用的linux命令
    存储过程基本了解
    wireshark抓包并进行Eigrp网络协议分析
    基于pytorch预训练模型使用Faster RCNN调用摄像头进行目标检测【无敌详细!简单!超少代码!】
    笔记本电脑配置知识大全
    6. Go的切片
    基于XML配置的AOP
    【STM32】基本定时器
    酷早报:6月30日Web3元宇宙业界重点消息大汇总
  • 原文地址:https://blog.csdn.net/wswq2505655377/article/details/126163352