vue使用$attrs和$listeners多级组件嵌套传递数据

 更新时间:2023年08月11日 11:29:17   作者:sugar_coffee  
这篇文章主要为大家介绍了vue使用$attrs和$listeners多级组件嵌套传递数据示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

多级组件嵌套需要传递数据

通常使用的方法是通过vuex。如果仅仅是传递数据,而不做中间处理,使用 vuex 处理,这就有点大材小用了。所以就有了 $attrs / $listeners ,通常配合 inheritAttrs 一起使用。

inheritAttrs:默认值为 true。

默认情况下父作用域的不被认作 props 的 attribute 绑定 (attribute bindings) 将会“回退”且作为普通的 HTML attribute 应用在子组件的根元素上。当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。而通过 (同样是 2.4 新增的) 实例 property $attrs 可以让这些 attribute 生效,且可以通过 v-bind 显性的绑定到非根元素上。查 看 官 网

感觉还是挺晦涩难懂的,简单的说就是 inheritAttrs:true 继承除props之外的所有属性;

inheritAttrs:false 只继承class属性

$attrs:包含了父作用域中不被认为 (且不预期为) props 的特性绑定 (class 和 style 除外),并且可以通过 v-bind=”$attrs” 传入内部组件。当一个组件没有声明任何 props 时,它包含所有父作用域的绑定 (class 和 style 除外)。

$listeners:包含了父作用域中的 (不含 .native 修饰符) v-on 事件监听器。它可以通过 v-on=”$listeners” 传入内部组件。它是一个对象,里面包含了作用在这个组件上的所有事件监听器,相当于子组件继承了父组件的事件。

话不多说,咱先上栗子

father.vue 组件

<template>
   <child :name="name" :age="age" :infoObj="infoObj" @updateInfo="updateInfo" @delInfo="delInfo" />
</template>
<script>
    import Child from '../components/child.vue'
    export default {
        name: 'father',
        components: { Child },
        data () {
            return {
                name: 'Lily',
                age: 22,
                infoObj: {
                    from: '上海',
                    job: 'policeman',
                    hobby: ['reading', 'writing', 'skating']
                }
            }
        },
        methods: {
            updateInfo() {
                console.log('update info');
            },
            delInfo() {
                console.log('delete info');
            }
        }
    }
</script>

child.vue 组件

<template>
    <grand-son :height="height" :weight="weight" @addInfo="addInfo" v-bind="$attrs" v-on="$listeners"  />
    // 通过 $listeners 将父作用域中的事件,传入 grandSon 组件,使其可以获取到 father 中的事件
</template>
<script>
    import GrandSon from '../components/grandSon.vue'
    export default {
        name: 'child',
        components: { GrandSon },
        props: ['name'],
        data() {
          return {
              height: '180cm',
              weight: '70kg'
          };
        },
        created() {
            console.log(this.$attrs); 
       // 结果:age, infoObj, 因为父组件共传来name, age, infoObj三个值,由于name被 props接收了,所以只有age, infoObj属性
            console.log(this.$listeners); // updateInfo: f, delInfo: f
        },
        methods: {
            addInfo () {
                console.log('add info')
            }
        }
    }
</script>

grandSon.vue 组件

<template>
    <div>
        {{ $attrs }} --- {{ $listeners }}
    <div>
</template>
<script>
    export default {
        ... ... 
        props: ['weight'],
        created() {
            console.log(this.$attrs); // age, infoObj, height 
            console.log(this.$listeners) // updateInfo: f, delInfo: f, addInfo: f
            this.$emit('updateInfo') // 可以触发 father 组件中的updateInfo函数
        }
    }
</script>

这种方式的传值对我来说不常用,感觉可读性不是很好。但其对于组件层级嵌套比较深,使用props会很繁琐,或者项目比较小,不太适合使用 Vuex 的时候,可以考虑用它。

以上就是vue使用$attrs和$listeners多级组件嵌套传递数据的详细内容,更多关于vue组件嵌套传递数据$attrs $listeners的资料请关注脚本之家其它相关文章!

相关文章

  • 快速解决Vue项目在IE浏览器中显示空白的问题

    快速解决Vue项目在IE浏览器中显示空白的问题

    今天小编就为大家分享一篇快速解决Vue项目在IE浏览器中显示空白的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 一文教你学会在Vue3中自定义指令

    一文教你学会在Vue3中自定义指令

    这篇文章主要为大家详细介绍一下如何在Vue3中实现自定义指令,文中的示例代码讲解详细,具有一定的借鉴价值,需要的同学可以参考一下
    2022-07-07
  • vue scss后缀文件background-image路径错误的解决

    vue scss后缀文件background-image路径错误的解决

    这篇文章主要介绍了vue scss后缀文件background-image路径错误的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 如何利用vue+vue-router+elementUI实现简易通讯录

    如何利用vue+vue-router+elementUI实现简易通讯录

    这篇文章主要介绍了如何利用vue+vue-router+elementUI实现简易通讯录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Antd的table组件表格的序号自增操作

    Antd的table组件表格的序号自增操作

    这篇文章主要介绍了Antd的table组件表格的序号自增操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 手把手教你如何使用Vite构建vue项目

    手把手教你如何使用Vite构建vue项目

    这篇文章主要介绍了如何使用Vite构建vue项目的相关资料,本文主要介绍了Vite构建Vue项目的详细步骤,包括检查node.js和pnpm的安装,构建Vite+Vue项目,利用HBuilderX导入项目,需要的朋友可以参考下
    2024-10-10
  • vue 3 effect作用与原理解析

    vue 3 effect作用与原理解析

    Vue3的Effect是其响应式系统的核心,负责依赖追踪和自动响应,它通过ReactiveEffect类封装副作用逻辑,实现依赖收集和触发更新,本文介绍vue 3 effect作用与原理解析,感兴趣的朋友一起看看吧
    2025-02-02
  • Vue.js中v-for指令的用法介绍

    Vue.js中v-for指令的用法介绍

    这篇文章介绍了Vue.js中v-for指令的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • vue中插值表达式使用的示例详解

    vue中插值表达式使用的示例详解

    Vue的插值表达式是一种特殊的语法,用于在模板中动态地将数据绑定到视图中,一般使用双大括号 ("{{ }}")将表达式包裹起来,下面我们就来根据三个案例来深入了解下插值表达式的使用吧
    2023-11-11
  • Vue3项目打包并部署到Nginx实践

    Vue3项目打包并部署到Nginx实践

    本文介绍了如何安装Nginx并部署Vue项目,首先从官网下载Nginx并启动服务,然后使用Vite构建Vue项目,将构建好的dist文件夹部署到Nginx目录下,并修改nginx.conf文件以防止刷新页面时出现404错误,最后,总结了刷新页面空白问题的解决方法
    2026-01-01

最新评论