VUE中如何优雅实现爷孙组件的数据通信

 更新时间:2022年04月18日 10:46:44   作者:今天写注释了吗  
所谓祖孙组件,也就是3层嵌套的组件,下面这篇文章主要给大家介绍了关于VUE中如何优雅实现爷孙组件的数据通信的相关资料,需要的朋友可以参考下
  • 在开发的过程中遇到这么个场景,我需要在爷组件中请求数据,请求到的数据呢需要在孙组件中使用。

  • 爷孙组件是这样的:我有一个根组件index.vue,根组件中有一个父亲组件<Father/>,在父亲组件中又有一个子组件,我们叫他孙组件<Son/>

  • 看到这个场景,vuex、eventBus是有些大材小用了,然后我就用了props,将数据传递给<Father/>,又将这个值通过props传给<Son/>。但是这么传递似乎又感觉有些low了,那有没有更好的办法呢?确实有!那就是$attrs和$listeners。

$attrs和$listeners如何使用呢?

  • $attrs是用来将数据从爷组件传递给孙组件的。
  • $listeners是用来从孙组件中触发爷组件中事件的。

$attrs的使用:

  • 在爷组件(index.vue)中,类似props传值,将需要传递的值绑定在父组件上。
  • 在父组件中,也是类似props传值,但是这里传递的就不是值了,而是$attrs。
  • 在孙组件中,接收props,这样就可以在孙组件中使用这个数据了。

(需要注意的是父组件中不需要接收props,只要在孙组件中接收就可以。)

然后上代码:

//index.vue:
<Father :homeInfo="homeInfo"/>

//Father.vue:
<Son v-bind="$attrs"/>

//son.vue:
<template>
    <div class="home">
    {{homeInfo.name}}
    </div>
</template>

<script>
export default {
    name: "Son",
    data() {
        return {};
    },
    props: {
        homeInfo: {
            default: Object,
            default: () => {},
        },
    },
};
</script>

$listeners的使用:

  • 在爷组件(index.vue)中,绑定事件。
  • 在父组件中,也是类似绑定事件,但是这里绑定的不是具体的事件,而是v-on="$listeners"。
  • 在孙组件中,需要的时候触发($emit)这个事件即可。

然后上代码:

//index.vue:
<Father :homeInfo="homeInfo" @update="update"/>

//Father.vue:
<Son v-bind="$attrs" v-on="$listeners"/>

//son.vue:
<template>
    <div class="home" @click="update">
    {{homeInfo.name}}
    </div>
</template>

<script>
export default {
    name: "Son",
    data() {
        return {};
    },
    props: {
        homeInfo: {
            default: Object,
            default: () => {},
        },
    },
    methods: {
        update() {
            const newHome = {
                name: 'new'
            }
            this.$emit("update", newHome)
        }
    }
};
</script>

总结:

其实$attrs和$listeners相当于是一个中转,主要用在父亲组件上。爷组件和孙组件保持以前的使用即可!

到此这篇关于VUE中如何优雅实现爷孙组件数据通信的文章就介绍到这了,更多相关VUE爷孙组件数据通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于实现Vue3版抖音滑动插件踩坑指南

    关于实现Vue3版抖音滑动插件踩坑指南

    这篇文章主要给大家介绍了关于实现Vue3版抖音滑动插件踩坑指南,文中通过实例代码介绍的非常详细,对大家学习或者使用vue3具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Vue中Vue router和axios的封装使用教程

    Vue中Vue router和axios的封装使用教程

    当用户登录后,后台会返回一个token给前端,前端下次进入首页后,会先判断token是否过期,如果过期自动进入登录页面,本文给大家介绍Vue中Vue router和axios的封装使用教程,感兴趣的朋友一起看看吧
    2023-11-11
  • Vue组件库Element-常见组件表格示例代码

    Vue组件库Element-常见组件表格示例代码

    对于Element组件的使用,最主要的就是明确自己想要达到的效果,从官网中将对应代码复制粘贴即可,最重要的是要读懂不同组件官网中提供的文档,以便实现自己想要的效果,本文给大家介绍Vue组件库Element-常见组件表格,感兴趣的朋友一起看看吧
    2023-10-10
  • Vue 使用高德地图添加点标记 + 点击地图获取坐标 + 带搜索(即地理编码 + 逆地理编码)  附完整示例

    Vue 使用高德地图添加点标记 + 点击地图获取坐标 + 带搜索(即地

    这篇文章主要介绍了Vue 使用高德地图添加点标记 + 点击地图获取坐标 + 带搜索(即地理编码 + 逆地理编码)  附完整示例,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-01-01
  • vue调用摄像头进行拍照并能保存到本地的方法

    vue调用摄像头进行拍照并能保存到本地的方法

    本文主要介绍了vue调用摄像头进行拍照并能保存到本地的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue 3中的异步操作管理示例分析

    Vue 3中的异步操作管理示例分析

    在现代Web应用开发中,异步操作是常见的挑战,本文介绍了Vue3中管理多个异步操作的方法,帮助开发者提高编码效率和应用性能,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • 解决找不到模块“xxx.vue”或其相应的类型声明问题

    解决找不到模块“xxx.vue”或其相应的类型声明问题

    这篇文章主要介绍了解决找不到模块“xxx.vue”或其相应的类型声明问题,具有很好的参考价值,希望对大家有所帮助。
    2022-10-10
  • 使用Vue中 v-for循环列表控制按钮隐藏显示功能

    使用Vue中 v-for循环列表控制按钮隐藏显示功能

    这篇文章主要介绍了使用Vue中 v-for循环列表控制按钮隐藏显示功能,需要的朋友可以参考下
    2019-04-04
  • vue.js 获取select中的value实例

    vue.js 获取select中的value实例

    下面小编就为大家分享一篇vue.js 获取select中的value实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue开发环境配置跨域的方法步骤

    vue开发环境配置跨域的方法步骤

    本文介绍了使用vue-cli搭建的项目在开发时配置跨域,上线后不做任何任何修改,接口也可以访问,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01

最新评论