Vue组件高级通讯之$attrs与$listeners

 更新时间:2023年06月25日 17:30:31   作者:扶得一人醉如苏沐晨  
这篇文章主要为大家介绍了Vue组件高级通讯之$attrs与$listeners使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

$attrs和$listeners

我们都知道父子组件的通信可以使用props和$emit的方式,但是如果进行父子组件和孙子组件的通讯使用props和$emit的话就比较复杂了,需要层层传递。而,$attrs和$listeners就减少了子组件的代码。它打通了父组件和孙组件之间的阻碍。

$attrs

官方介绍:

当父组件传数据给子组件的时候,如果子组件的props没有进行接收,那数据就会被收集到子组件的$attrs里面,在子组件上使用v-bind="$attrs"可以直接将值传给当前组件的子组件(也就是孙组件),即使是v-model依旧可以传递。

默认情况下父作用域的不被认作props的attribute绑定 (attribute bindings)

将会“回退”且作为普通的 HTML attribute 应用在子组件的根元素上。

当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。

通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。

而通过 (同样是 2.4 新增的) 实例 property $attrs 可以让这些attribute生效,

且可以通过 v-bind 显性的绑定到非根元素上。

$listeners

官方介绍:

举例

父组件

<template>
  <div class="app">
    <h3>我是爷爷组件</h3>
    <Parent  :data1="data1" :data2="data2" :data3="data3" @fun1="fun1" @fun2="fun2"></Parent>
  </div>
</template>
<script>
import Parent from './components/Parent.vue'
export default {
  name: "App",
  components: {
    Parent
  },
  data() {
    return {
      data1: '数据1',
      data2: '数据2',
      data3: '数据3'
    }
  },
  methods: {
    fun1(val) {
      console.log('通过子组件触发', val);
    },
    fun2(val) {
      console.log('通过子组件触发', val);
    }
  }
}
</script>

子组件

<template>
  <div class="parent">
    <h3>我是父组件</h3>
    <Son v-bind="$attrs" v-on="$listeners"></Son>
  </div>
</template>
<script>
import Son from './Son'
export default {
//禁用将数据显示在组件根元素的默认操作
  inheritAttrs: false,
  name: 'Parent',
  props: {
    data1: {
      type: String,
      default: ''
    }
  },
  components: {
    Son
  },
  created() {
    console.log(this.$attrs, this.$listeners, 'this.$attrs,this.$listeners');  //data2: "数据2", data3: "数据3",fun1, fun2
  },
}
</script>

孙组件

<template>
  <div class="son">
    <h3>我是子组件</h3>
    这是爷爷的数据{{user}} <br>
    这是自己的数据{{myUser}}<br>
    <button @click="toParent">传递数据给父组件</button>
  </div>
</template>
<script>
import Son from './Son'
export default {
  name: 'Son',
  components: {
    Son
  },
  props: {
  //接收父组件的数据
    data2: {
      type: String,
      default: ''
    },
    data3: {
      type: String,
      default: ''
    }
  },
  created() {
    console.log(this.data2, this.data3, '$attrs');
  },
  methods: {
    toParent() {
    //触发父组件的方法
      this.$emit('fun1', '我是孙组件数据')
    }
  }
}
</script>

以上就是Vue组件高级通讯之$attrs与$listeners的详细内容,更多关于Vue组件通讯$attrs $listeners的资料请关注脚本之家其它相关文章!

相关文章

  • 解决vscode Better Comments插件在vue文件中不显示相对应的颜色的问题

    解决vscode Better Comments插件在vue文件中不显示相对应的颜色的问题

    最近使用了Better Comments这款插件,发现在ts文件中可以显示对应的颜色,但在vue文件中并不显示对应颜色 ,下面小编给大家分享解决方法,感兴趣的朋友跟随小编一起看看吧
    2022-09-09
  • vue混入mixin流程与优缺点详解

    vue混入mixin流程与优缺点详解

    混入(mixin)提供了一种非常灵活的方式,来分发vue组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项
    2022-09-09
  • vue实现大转盘抽奖功能

    vue实现大转盘抽奖功能

    这篇文章主要为大家详细介绍了vue实现大转盘抽奖功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 基于Axios 常用的请求方法别名(详解)

    基于Axios 常用的请求方法别名(详解)

    下面小编就为大家分享一篇Axios 常用的请求方法别名,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue实现拖拽排序效果

    vue实现拖拽排序效果

    这篇文章主要为大家详细介绍了vue实现拖拽排序效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 解决Vue.js由于延时显示了{{message}}引用界面的问题

    解决Vue.js由于延时显示了{{message}}引用界面的问题

    今天小编就为大家分享一篇解决Vue.js由于延时显示了{{message}}引用界面的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Vue3 使用v-md-editor如何动态上传图片的方法实现

    Vue3 使用v-md-editor如何动态上传图片的方法实现

    本文主要介绍了Vue3 使用v-md-editor如何动态上传图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • VueJS事件处理器v-on的使用方法

    VueJS事件处理器v-on的使用方法

    本篇文章主要介绍了VueJS事件处理器v-on的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 手把手教你Vue3如何封装组件

    手把手教你Vue3如何封装组件

    vue2和vue3的组件封装还是有区别,下面这篇文章主要给大家介绍了关于Vue3如何封装组件的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用vue3具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • Vue.js事件处理器与表单控件绑定详解

    Vue.js事件处理器与表单控件绑定详解

    这篇文章主要为大家详细介绍了Vue.js事件处理器与表单控件绑定详解的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03

最新评论