文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue祖孙组件怎么实现传值

2023-07-05 16:41

关注

这篇文章主要介绍了Vue祖孙组件怎么实现传值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue祖孙组件怎么实现传值文章都会有所收获,下面我们一起来看看吧。

先看基础

祖孙组件,也就是 3 层嵌套的组件。关于 vue 中父子组件之间的数据传递是通过 props$emit 实现,参考 Vue 父子组件传值。

那祖孙组件之间传值怎么实现,先了解下面的几个 vue 属性。

$props

当前组件接收到的 props 对象。Vue 实例代理了对其 props 对象 property 的访问。

$attrs

$attrs 是一个 Object,它包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (classstyle 除外)。

如果组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (classstyle 除外),并且可以通过 v-bind="$attrs" 传入内部组件。

怎么理解呢?

就是父组件绑定到子组件上的属性,在子组件中没有声明 props 进行接收的那些属性会被包含在 attrs 中,举个栗子

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

parent.vue

<Child :data1="data1" :data2="data2" /><script>import Child from './child'...data(){  return{    data1: 'String',    data2: ['String','Array']  }}...</script>

但在子组件的 props 只对 data1 做了接收声明,那 data2 就会被包含在 $attrs 中。

在子组件中也是可以取到 $attrs 的值的,既然是对象,那就还可以按照属性名来取值的。

child.vue

<template>  <div>    <div>$attrs: {{ $attrs }}</div>    <div>data2: {{ $attrs['data2'] }}</div>  </div></template><script>...props: ['data1'], data(){  return{...}}...</script>

Vue祖孙组件怎么实现传值

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

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

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

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

???? 注意:这个选项不影响 classstyle 绑定。

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

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

Vue祖孙组件怎么实现传值

然后是使用 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 &rarr; Father &rarr; GrandSon

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

GrandFather.vue

<template>  <div class="parent">    ????爷爷    <Father :msg1="msg1" :msg2="msg2" />  </div></template><script>import Father from './Father'export default {  components: {Father},  data () {    return {      msg1: '1️⃣我是GrandFather,把第二条传给GrandSon',      msg2: '2️⃣GrandSon你好,我是GrandFather'    }  }}</script>

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

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

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

Father.vue

<template>  <div class="parent">    ????父亲    <p>GrandFather说:{{msg1}}。{{msg2}}</p>    <GrandSon :msg2="msg2" />  </div></template><script>import GrandSon from './GrandSon'export default {  props: ['msg1', 'msg2'],  components: {GrandSon},}</script>

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

GrandSon.vue

<template><div class="child">  ????孙子  <p>GrandFather说:{{msg2}}</p></div></template><script>export default {  props: ['msg2']}</script>

Vue祖孙组件怎么实现传值

小结

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

2. $attrs

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

vue2.4.0 版本中新增了 $attrs 属性。根据前面的理解 $attrs 就是没有在 props 中声明要接收的一些属性。此外,还可以通过 v-bind="$attrs" 把来自父组件的一些属性直接传递到子组件中。

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

GrandFather 组件不用做修改

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

当然,在 Father 中还是可以访问 $attrs 的。在代码中访问要使用 this.$attrs

Father.vue

<template>  <div class="parent">    ????父亲    <p>$attrs:{{$attrs}}</p>    <GrandSon v-bind="$attrs" />  </div></template><script>import GrandSon from './GrandSon'export default {  props: ['msg1'], //只接收了msg1  components: {GrandSon},}</script>

子组件也不需要做修改

Vue祖孙组件怎么实现传值

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

孙传祖

$listeners

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

GrandFather.vue

<template>  <div class="parent">    ????爷爷    <div>GrandSon的回复:{{reply}}</div>    <Father :msg1="msg1" :msg2="msg2" @getReply="getReply"/>  </div></template><script>import Father from './Father'export default {  components: {Father},  data () {    return {      msg1: '1️⃣我是GrandFather,把第二条传给GrandSon',      msg2: '2️⃣GrandSon你好,我是GrandFather',      reply: '' //接收来自GrandSon的消息    }  },  methods: {        getReply (param) {      this.reply = param    }  }}</script>

Father 中使用 v-on="$listeners"GrandFather 的事件绑定到 GrandSon

Father.vue

<template>  <div class="parent">    ????父亲    <p>$attrs:{{$attrs}}</p>    <GrandSon v-bind="$attrs" v-on="$listeners" />  </div></template><script>import GrandSon from './GrandSon'export default {  props: ['msg1'],  components: { GrandSon },}</script>

GrandSon 中触发来自 GrandFather 的自定义事件就 ???? 了,有两种方式。

this.$listeners.eventName(param)

this.$emit(eventName, param)

GrandSon.vue

<template><div class="child">  ????孙子  <p>GrandFather说:{{msg2}}</p>  <button @click="reply">回复GrandFather</button></div></template><script>export default {  props: ['msg2'],  data () {    return {      replyWord: 'GrandFather你好,我是GrandSon,收到消息了'    }  },  methods: {    reply () {      this.$emit('getReply', this.replyWord)      // this.$listeners.getReply(this.replyWord)    }  }}</script>

Vue祖孙组件怎么实现传值

关于“Vue祖孙组件怎么实现传值”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Vue祖孙组件怎么实现传值”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯