通过$listeners、inheritAttrs、$attr实现组件之间的数据通信

栏目: 编程语言 · 发布时间: 5年前

内容简介:默认情况下,子组件无法获取到只读的VUE实例属性,包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外),并且可以通过包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。

适用于一下场景中的组件通行

  • 项目比较小,不适合用VueX对状态进行处理
  • 组件嵌套比较深,使用props会很繁琐

缺点

  • 代码的可读性比较低
  • 代码维护性比较低

基本概念

inheritAttrs

默认情况下,子组件无法获取到 props 中未定义的值。通过将 inheritAttrs=true 禁止这种默认行为,配合 $attr 获取到父作用域中所有的属性(除了props传递的属性以及Class或者Style)来进行父组件向子组件传值

vm.$attr

只读的VUE实例属性,包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外),并且可以通过 v-binnd=$arrts 传入内部组件中

vm.$listeners

包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。

DEMO

App.vue

<template>
      <child1 :words1="text1" :words2="text2" :words3="text3" v-on:event1="goEvent1" v-on:event2="goEvent2">
      </child1>
   </template>
   <script>
      import Child1 from '@components/child1.vue'
       export default {
           name: 'app',
           data () {
               return {
                   text1: 1,
                   text2: 2,
                   text3: 3
               }
           },
           methods: {
               goEvent1() {
                    console.log('child 提交成功');
                },
                goEvent2(value) {
                    console.log(value);
                }
           }
       }
   </script>

child1.vie

<template>
       <div class="child-1">
          <p>props: {{words1}}</p>
          <p>$attrs: {{$attrs}}</p>
          <button @click="submit()">提交</button>
          <hr>
          <child2 v-bind="$attrs" v-on="$listeners"></child2>
          <!-- 通过$listeners将父作用域中的v-on事件监听器,传入child2,使得child2可以获取到app中的事件 -->
       </div>
    </template>
    <script>
    import Child2 from './child2.vue'
    export default {
        name: 'child1',
        props: ['words1'],
        data() {
          return {};
        },
        inheritAttrs: false,
        components: { Child2 },
        methods: {
          submit () {
            this.$emit('event1', 'child1 提交事件')
          }
        }
    }
    </script>

child2.vue

<template>
      <div>
        <div class="child-2">
          <p>props: {{words2}}</p>
          <p>$attrs: {{$attrs}}</p>
          <input v-model="inputValue" name="" id="" @input="goInput">
        </div>
      </div>
    </template>
    <script>
    export default {
        name: 'child2',
        props: ['words2'],
        data() {
            return {
              inputValue: ''
            };
        },
        inheritAttrs: false,
        mounted() {
        },
        methods: {
          goInput () {
            this.$emit('event2', this.inputValue);
          }
        }
    }
    </script>

以上是通过学习,我对这种通信方式的总结,对于我来说,可能不常用,不过也加深了我对组件的理解,大家多多交流吧~


以上所述就是小编给大家介绍的《通过$listeners、inheritAttrs、$attr实现组件之间的数据通信》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ACM程序设计

ACM程序设计

曾棕根 / 北京大学 / 2011-4 / 34.00元

《ACM程序设计(第2版)》详细讲解了ACM国际大学生程序设计竞赛(ACM/ICPC)编程、调试方法,以及提高时间、空间性能的策略,并充分利用了C++泛型编程的高效率、规范化的特性,全部采用C++泛型编程。第1章讲解了ACM程序设计入门知识;第2章讲解了C++泛型编程的容器、迭代器和常用算法;第3章讲解了ACM程序设计的基本编程技巧;第4章讲解了50道原版ACM竞赛题的解题思路,并配有C++泛型编......一起来看看 《ACM程序设计》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具