Vue祖孙组件怎么传值(1)

🎈 在父组件中对子组件绑定了两个属性 data1 data2。

parent.vue

🎈 但在子组件的props只对 data1 做了声明接收,那 data2 就会被包含在 $attrs 中。在子组件中也是可以取到 $attrs 的值的,既然是对象,那就还可以按照属性名来取的。

child.vue

$attrs: {{$attrs}}
data2: {{$attrs['data2']}}

在这里插入图片描述

😀 其实到这里还没有结束,接着聊聊 inheritAttrs 吧。不过这和传值之间关系不大。

inheritAttrs 是 vue 2.4.0 的新增选项,官方的介绍是酱紫的。

1️⃣ 默认情况下父作用域的不被认作 props 的 attribute 绑定 (attribute bindings) 将会“回退”且作为普通的 HTML attribute 应用在子组件的根元素上。当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。

2️⃣ 而通过 (同样是 2.4 新增的) 实例 property $attrs 可以让这些 attribute 生效,且可以通过 v-bind 显性的绑定到非根元素上。

🚫 注意:这个选项不影响 class 和 style 绑定。

第1️⃣简单理解就是前面说的,在子组件中的 props 没有声明接收的属性(也就是 $attrs 所包含的属性)会被绑定到这个子组件的 HTML 根节点上,我们检查代码也是可以看到的。

就像下面的例子,来自父组件的消息没有被接收时会作为属性被渲染到子组件的根节点上。

在这里插入图片描述

然后是使用 inheritAttrs: false 可以避免被渲染。

第2️⃣说的就是可以通过 v-bind=“$attrs” 把这些属性绑定到其他的节点上(包括子节点,这是祖孙组件传值的技术基础)

$listeners

vue 2.4.0 新增

$ listeners 是个 Object。包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on=“$listeners” 传入内部组件。

祖传孙


在 vue 中,祖孙组件之间是不能直接通信的,需要通过父组件作为 中间组件。实际上祖父的关系就是两个 父与子 的关系。

1 $props 链

【不推荐使用】

既然是两个父与子之间的关系,那就可以 祖传父 再由 父传子。而 props 可以用来接收来自父组件的值,那就可以通过 props 实现链式传递了。不举栗子🌰了,举个香蕉吧🍌。

传递次序:GrandFather → Father → GrandSon

① 在 GrandFather 中给 Father 传递了两条消息。

GrandFather.vue

🎈爷爷

② Father 中使用 props 接收了来自 GrandFather 的所有消息。是的,他把所有的消息都收下了而且还可以随便看😱。

当然使用 props 链传递就必须要 Father 接收之后才能继续传递。

看完消息之后,Father 按照 GrandFather 的意思,把 msg2 传递给了 GrandSon

Father.vue

🎈父亲

GrandFather说:{{msg1}}。{{msg2}}

③ 终于到 GrandSon 了,它通过 props 从 Father 那里接收到了来自 GrandFather 的消息。

GrandSon.vue

🎈孙子

GrandFather说:{{msg2}}

在这里插入图片描述

小结

这种方式虽然是比较容易理解,但也是比较繁琐的。中间组件需要接收所有的 props 等。

2 $attrs

上面的 $props 传值方式必须要经过 Father 接收之后继续传递,也是个缺点,毕竟 Father 还是很忙的,要负责自己的功能,不能总为爷孙俩接传消息😂。

vue 在 2.4.0 版本中新增了 $attrs 属性。根据前面的理解 a t t r s 就 是 没 有 在 p r o p s 中 声 明 要 接 收 的 一 些 属 性 。 此 外 , 还 可 以 通 过 v − b i n d = " attrs 就是没有在 props 中声明要接收的一些属性。此外,还可以通过 v-bind=" attrs就是没有在props中声明要接收的一些属性。此外,还可以通过v−bind=“attrs” 把来自父组件的一些属性直接传递到子组件中。

这样一来,Father组件就没必要在 props 中声明接收那些不必要属性了。看看实例吧!

① GrandFather 组件不用做修改

② 这次在 Father 中只在 props 接收了 msg1,与自己无关的直接使用 v-bind=“attrs” 绑定到子组件上。

当然,在 Father 中还是可以访问 a t t r s 的 。 在 代 码 中 访 问 要 使 用 t h i s . attrs 的。在代码中访问要使用 this. attrs的。在代码中访问要使用this.attrs

Father.vue

🎈父亲

$attrs:{{$attrs}}

③ 子组件也不需要做修改

在这里插入图片描述

在 Father 中接收了 msg1,所以在 Father 中继续传递的就只有 msg2 了。

孙传祖
$listeners

给 Father 组件绑定 自定义事件 getReply ,便于后面在 GrandSon 中触发

GrandFather.vue

# 最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-1jNscStR-1715700086667)]

[外链图片转存中…(img-79IIsFsv-1715700086668)]

[外链图片转存中…(img-Qsy7hDeO-1715700086668)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中,可以使用Props和Events来实现祖孙组件之间的传值。 1. Props:父组件可以通过props将数据传递给子组件。在子组件中,可以通过props选项接收这些数据。具体步骤如下: 父组件: ```vue <template> <div> <ChildComponent :message="message" /> </div> </template> <script> import ChildComponent from './ChildComponent' export default { components: { ChildComponent }, data() { return { message: 'Hello from parent component' } } } </script> ``` 子组件: ```vue <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] } </script> ``` 在父组件中,使用冒号(:)绑定属性,并将数据传递给子组件。子组件中通过props选项接收这个属性。 2. Events:子组件可以通过事件将数据传递给父组件。在子组件中,可以使用$emit方法触发一个自定义事件,并传递数据给父组件。具体步骤如下: 父组件: ```vue <template> <div> <ChildComponent @update-message="updateMessage" /> <p>{{ message }}</p> </div> </template> <script> import ChildComponent from './ChildComponent' export default { components: { ChildComponent }, data() { return { message: '' } }, methods: { updateMessage(newMessage) { this.message = newMessage } } } </script> ``` 子组件: ```vue <template> <div> <button @click="sendMessage">Send Message</button> </div> </template> <script> export default { methods: { sendMessage() { this.$emit('update-message', 'Hello from child component') } } } </script> ``` 在子组件中,使用@click绑定一个点击事件,并在事件处理程序中使用this.$emit方法触发自定义事件。父组件中通过@update-message监听这个事件,并在对应的事件处理函数中更新父组件的数据。 这样就实现了祖孙组件之间的传值。父组件通过props将数据传递给子组件,子组件通过事件将数据传递给父组件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值