Vue中通过$attrs实现爷爷直接向孙组件传递数据

前言

最近在重读vue3文档,读到"#Class与Style绑定"这一章节时突然发现,通过$attrs可以直接实现爷爷组件向孙子组件传递数据。

不考虑注入依赖provide/inject和vuex的情况下,父子组件传递数据时最常用的是props,遇到爷传孙的情况,会先爷传父再父传子,可以完成需求但总有点那啥,使用$attrs就可以直接实现爷传孙,毕竟少写一行代码是一行啊。

实现

具体实现(以vue3为例):

js 复制代码
<--爷组件-->
<script setup>
import { ref } from 'vue';
import Father from './components/Father.vue'
const fatherStr = ref('这是爸爸的数据')
const childStr = ref('这是孙子的数据')
</script>
<template>
  <Father :fatherStr="fatherStr" :childStr='childStr'></Father>
</template>

爷组件向父组件和孙组件各传递了数据,父组件代码如下:

js 复制代码
<--父组件-->
<script setup>
import Child from './child.vue'
</script>
<template>
  <div>
    <p >father</p>
    <p>{{ $attrs.fatherStr }}</p>
    <Child v-bind="$attrs"></Child>
  </div>
</template>

孙组件代码如下:

js 复制代码
<--孙组件-->
<script setup>
</script>
<template>
  <div>
    <p >child</p>
    <p>{{ $attrs.childStr }}</p>
  </div>
</template>

最后页面实现效果如下:

优化

虽然实现了,但是通过阅读Vue文档可以发现,他并不是响应式的。

对于不需要经常变动的数据应该是够用了,但是如果是响应式的数据,可能会有问题,所以做了以下优化。 爷组件不变,父组件和孙组件代码分别如下。

javascript 复制代码
<--父组件-->
<script setup>
import Child from './child.vue'
const props = defineProps(['fatherStr'])
</script>

<template>
  <div>
    <p >father</p>
    <p>{{ fatherStr }}</p>
    <Child v-bind="$attrs"></Child>
  </div>
</template>

<style scoped>
</style>
javascript 复制代码
<--孙组件-->
<script setup>
const props = defineProps(['childStr'])
</script>

<template>
  <div>
    <p >child</p>
    <p>{{ childStr }}</p>
  </div>
</template>

<style scoped>
</style>

效果还是一样的:

这些是看文档中突然想到的,就写了个小demo,如果有问题,请各位大佬告诉我😂

相关推荐
千寻girling8 分钟前
面试官 : “ 说一下 localhost 和127.0.0.1 的区别 ? ”
前端·javascript·面试
老华带你飞9 分钟前
智能菜谱推荐|基于java + vue智能菜谱推荐系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
指尖跳动的光12 分钟前
cookie可以实现不同域共享吗
前端
YAY_tyy12 分钟前
Turfjs+Three.js:地理数据的三维建模应用
前端·javascript·3d·arcgis·turfjs
小南知更鸟22 分钟前
前端静态项目快速启动:python -m http.server 4173 与 npx serve . 全解析
前端·python·http
@淡 定1 小时前
DDD领域事件详解:抽奖系统实战
开发语言·javascript·网络
CamilleZJ1 小时前
react-i18next+i18next使用
前端·i18next·react-i18next
汐泽学园1 小时前
基于Vue的幼儿绘本阅读启蒙网站设计与实现
前端·javascript·vue.js
mikan1 小时前
详解把老旧的vue2+vue-cli+node-sass项目升级为vite
前端·javascript
七宝三叔1 小时前
C# 上位机开发中的动态绑定与虚拟化
前端