广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue祖孙组件如何实现传值
  • 485
分享到

Vue祖孙组件如何实现传值

Vue祖孙组件Vue传值Vue组件 2023-03-24 17:03:14 485人浏览 泡泡鱼
摘要

目录先看基础$props$attrs$listeners祖传孙1. $props 链2. $attrs孙传祖$listeners总结先看基础 祖孙组件,也就是 3 层嵌套的组件。关于

先看基础

祖孙组件,也就是 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>

子组件中取出$attrs

其实到这里还没有结束,接着聊聊 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 根节点上,我们检查代码也是可以看到的。

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

然后是使用 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

<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>

小结

这种方式虽然是比较容易理解,但也是比较繁琐的。中间组件需要接收所有的 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>

子组件也不需要做修改

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>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Vue祖孙组件如何实现传值

本文链接: https://www.lsjlt.com/news/201230.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue祖孙组件如何实现传值
    目录先看基础$props$attrs$listeners祖传孙1. $props 链2. $attrs孙传祖$listeners总结先看基础 祖孙组件,也就是 3 层嵌套的组件。关于...
    99+
    2023-03-24
    Vue祖孙组件 Vue传值 Vue组件
  • Vue祖孙组件怎么实现传值
    这篇文章主要介绍了Vue祖孙组件怎么实现传值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue祖孙组件怎么实现传值文章都会有所收获,下面我们一起来看看吧。先看基础祖孙组件,也就是 3 层嵌套的组件。关于 vu...
    99+
    2023-07-05
  • vue如何实现父子组件传值
    小编给大家分享一下vue如何实现父子组件传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!父子组件传值<!DOCTYPE&...
    99+
    2022-10-19
  • vue组件如何传值
    这篇文章主要介绍“vue组件如何传值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue组件如何传值”文章能帮助大家解决问题。传值方法:1、利用props实现父传子;2、子传父,需要自定义事件,在子...
    99+
    2023-07-04
  • Vue和React组件间如何实现传值
    这篇文章主要讲解了“Vue和React组件间如何实现传值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue和React组件间如何实现传值”吧!组件间的传值方式组件的传值场景无外乎以下几种:...
    99+
    2023-07-04
  • Vue中如何实现父子组件传值
    Vue中如何实现父子组件传值,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(一)传递数值1.子组件:Header.vue<templat...
    99+
    2022-10-19
  • Vue中父子组件如何实现传值
    目录前言一、将子组件引入父组件二、父组件如何传值给子组件三、子组件如何接收父组件传过来的值并使用(props)四、子组件如何传值给父组件($emit)五、父组件使用子组件传过来的值总...
    99+
    2023-01-28
    Vue父子组件 Vue组件传值 Vue父子组件传值
  • vue如何实现父组件向子组件进行传值
    这篇文章给大家分享的是有关vue如何实现父组件向子组件进行传值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。父组件向子组件进行传值:在子组件绑定父的数据,子组件通过props接受参数。接下来我们通过一个例子,说明...
    99+
    2023-06-17
  • vue如何实现子组件向父组件进行传值
    这篇文章主要为大家展示了“vue如何实现子组件向父组件进行传值”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现子组件向父组件进行传值”这篇文章吧。子组件向父组件进行传值:父组件内设置...
    99+
    2023-06-17
  • vue中怎么实现组件传值
    这篇文章给大家分享的是有关vue中怎么实现组件传值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是,使用Vue可...
    99+
    2023-06-14
  • Vue和React组件怎么实现传值
    本篇文章为大家展示了Vue和React组件怎么实现传值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。组件间的传值方式组件的传值场景无外乎以下几种:父子之间兄弟之间多...
    99+
    2022-10-19
  • Vue两个同级组件传值实现
    Vue组件之间是有联系的,避免不了组件之间要互相传值,父给子使用v-bind绑定自定义属性和使用props来接受 子给父使用@自定义事件='函数' this.$emit('自定义事...
    99+
    2022-11-12
  • Vue组件间传值的实现解析
    目录1. 父组件向子组件传值1.1 描述1.2 props接收数据2. 子组件向父组件传值3. 兄弟组件间传值4. 事件总线5. Ref6. root/parent/children...
    99+
    2022-11-13
  • VUE中如何优雅实现爷孙组件的数据通信
    目录$attrs和$listeners如何使用呢?$attrs的使用:$listeners的使用:总结:在开发的过程中遇到这么个场景,我需要在爷组件中请求数据,请求到的数据呢需要在孙...
    99+
    2022-11-13
  • vue父组件如何向子组件传值
    vue父组件向子组件传值的方法:vue父组件是通过props向子组件传值的,示例如下:父组件调用子组件时,绑定动态属性。<v-header :title='title' :homemsg='...
    99+
    2022-10-22
  • vue中怎么实现子组件向父组件传值
    这篇文章给大家介绍vue中怎么实现子组件向父组件传值,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。父组件这么写<component-a v-on:child-say=&...
    99+
    2022-10-19
  • Vue中怎么实现父组件向子组件传值
    这期内容当中小编将会给大家带来有关Vue中怎么实现父组件向子组件传值,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1:在src/components/child/文件夹下...
    99+
    2022-10-19
  • vue如何用组件传值实现观察者模式
    这篇文章主要介绍“vue如何用组件传值实现观察者模式”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue如何用组件传值实现观察者模式”文章能帮助大家解决问题。第一步,我们先在main.js中注册一下...
    99+
    2023-07-04
  • Vue实现父子组件传值其实不难
    目录父传子代码实现子传父代码实现总结父传子 通过 props。props 就是用来接收来自父组件的数据的。 下图是大致的示意图。 代码实现 1.在父组件中引用子组件时,使用属性传...
    99+
    2023-03-24
    Vue父子组件传值 Vue父子组件 Vue组件传值
  • vue中父组件如何给子组件传值
    小编给大家分享一下vue中父组件如何给子组件传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一般情况下我们父子之间的传值用的是...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作