iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue如何实现组件通信
  • 131
分享到

vue如何实现组件通信

2023-06-29 09:06:55 131人浏览 八月长安
摘要

这篇文章主要介绍Vue如何实现组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在vue中, 组件的关系不外乎以下三种:组件是需要通信的,在开发中,常用到的通信方式有:vuex、eventBus、以及prop

这篇文章主要介绍Vue如何实现组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

前言

在vue中, 组件的关系不外乎以下三种:

vue如何实现组件通信

组件是需要通信的,在开发中,常用到的通信方式有:vuex、eventBus、以及props与emit、$parent与$children,除此之外,还有provide与inject、$attrs与$listeners等。

一、vuex

这个相信大家用的很多了,简单回顾一下:

  • State:放状态的地方

  • Mutation:唯一修改状态的地方,不支持异步

  • Action:通过调用Mutation中的方法来达到修改状态的目的,支持异步

  • Getter:可以理解为计算属性

  • Module:模块,每个模块拥有自己的 state、mutation、action、getter

简单的使用这里不赘述,提一下module里面的命名空间。

如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名

vue如何实现组件通信

这样,在使用的时候我们就可以这样用了:

vue如何实现组件通信

二、eventBus

这个称为‘事件总线’,简单看下是怎么使用的:

  • 初始化

首先是初始化一个eventBus,可以绑定到vue原型上,也可以绑定到window对象上,还可以抽出来当做一个模块,在需要的时候再引入。这里直接绑定到vue原型上:

vue如何实现组件通信

  • 创建事件和删除事件

在需要的组件上创建和删除事件:

vue如何实现组件通信

  • 触发事件

最后就是在需要的地方触发事件了

vue如何实现组件通信

三、props/emit

这个不用多说了,父子通信用的最多的应该就是这个了。当然,如果以子组件为跳板,也可以做到祖孙之间通信,不过比较麻烦。不建议这样操作。

四、$parent/$children

$parent直接访问的就是父实例,而$children则返回的是实例数组。所以我一般都是$parent搭配$refs使用。

五、$attrs/$listeners

这两个可能会用的比较少,来看下官网的介绍:

vue如何实现组件通信

怎么理解呢,简单来讲就是,$attrs接收除了prop、style、class之外的所有绑定属性,$listeners则接收除了被.native修饰的所有绑定事件。具体来看下例子:

<template>  <div>    <p>父组件</p>    <input type="text" v-model="fORMData.inputValue" />    <p>子组件</p>    <Son      :inputValue="formData.inputValue"      :otherValue="otherValue"      @success="success"      @input.native="handleInput"      v-bind="$attrs"      v-on="$listeners"    ></Son>  </div></template><script>import Son from "./son.vue";export default {  components: { Son },  provide() {    return {      father: this.formData,    };  },  data() {    return {      formData: {        inputValue: "123",      },      otherValue: 999,    };  },  methods: {    success(data) {      console.log(data);    },    handleInput() {},  },};</script>
<template>  <div>    <input type="text" v-model="inputValue" @change="handleChange" />  </div></template><script>export default {  props: {    inputValue: String,  },  created() {    console.log(this.$attrs, "son---$attrs");    console.log(this.$listeners, "son---$listeners");  },  methods: {    handleChange() {      this.father.inputValue = this.inputValue;    },  },};</script>

按照之前的理解,$attrs应该只能接收到otherValue,$listeners则只能接收到success事件,看下打印结果:

vue如何实现组件通信

结果确实也是这样的。除此之外,还可传递给孙组件:

<template>  <div>    <input type="text" v-model="inputValue" @change="handleChange" />    <GrandSon v-bind="$attrs" v-on="$listeners"></GrandSon>  </div></template><script>import GrandSon from "./grandSon.vue";export default {  components: { GrandSon },  props: {    inputValue: String,  },  created() {    console.log(this.$attrs, "son---$attrs");    console.log(this.$listeners, "son---$listeners");  },  methods: {    handleChange() {      this.father.inputValue = this.inputValue;    },  },};</script>
<template>  <div>    <input type="text" v-model="inputValue" @change="handleChange" />  </div></template><script>export default {  props: {    inputValue: String,  },  created() {    console.log(this.$attrs, "grandSon---$attrs");    console.log(this.$listeners, "grandSon---$listeners");  },  methods: {    handleChange() {      this.father.inputValue = this.inputValue;    },  },};</script>

vue如何实现组件通信

通过这种方式,祖孙之间也实现了通信。

六、provide/inject

provide/inject可以在一个祖先组件中向它的所有后辈组件注入一个依赖,只要上下游关系成立就能生效。简单的理解就是provide是注入数据,inject是获取数据。所以provide是用于父组件,inject是用于子孙组件。provide应该是一个对象或者返回一个对象的函数,inject应该是一个字符串数组或者一个对象。官网提到这么一句话:

提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的 property 还是可响应的。

这句话怎么理解呢?字面理解就是你要想在上下游传递的那个数据是可响应的,那么就应该以对象的形式传递,先试一下以基本数据类型的形式传递,看下例子:
父组件:

<template>  <div>    <p>父组件</p>    <input type="text" v-model="inputValue" />    <p>子组件</p>    <Son></Son>    <p>孙组件</p>    <GrandSon></GrandSon>  </div></template><script>import Son from "./son.vue";import GrandSon from "./grandSon.vue";export default {  components: { Son, GrandSon },  provide() {    return {      father: this.inputValue,    };  },  data() {    return {      inputValue: "123",    };  },};</script>

子组件:

<template>  <div>    <input type="text" v-model="inputValue" @change="handleChange" />  </div></template><script>export default {  inject: ["father"],  data() {    return {      inputValue: "",    };  },  watch: {    father(val) {      console.log(val, "val");      this.inputValue = val;    },  },  created() {    console.log(this, "this");  },  methods: {    handleChange() {      this.father.inputValue = this.inputValue;    },  },};</script>

在子组件打印this:

vue如何实现组件通信

可以看到,父组件的inputValue值是被注入到子组件当中的。但却监听不到这个father。

vue如何实现组件通信

然后,我们改成以对象的形式进行注入:

<template>  <div>    <p>父组件</p>    <input type="text" v-model="formData.inputValue" />    <p>子组件</p>    <Son></Son>    <p>孙组件</p>    <GrandSon></GrandSon>  </div></template><script>import Son from "./son.vue";import GrandSon from "./grandSon.vue";export default {  components: { Son, GrandSon },  provide() {    return {      father: this.formData,    };  },  data() {    return {      formData: {        inputValue: "123",      },    };  },};</script>
<template>  <div>    <input type="text" v-model="inputValue" @change="handleChange" />  </div></template><script>export default {  inject: ["father"],  data() {    return {      inputValue: "",    };  },  watch: {    'father.inputValue'(val){      console.log(val, "val");      this.inputValue = val;    },  },  created() {    console.log(this, "this");  },  methods: {    handleChange() {      this.father.inputValue = this.inputValue;    },  },};</script>

这个时候我们看下打印的this以及效果:

vue如何实现组件通信

vue如何实现组件通信

这样就可以实现数据的响应了。这里有一个点需要注意,如果在父组件中将整个父组件的this注入到后代组件中,在后代组件中是不能通过深度监听来监听这个注入的对象的,会报堆栈溢出的错误。所以这里我用的是this.formData的形式注入。这样在子孙组件中可以通过'father.inputValue'这样的形式监听,也可以通过这样的形式:

father: {      handler(val) {        console.log(val);      },      deep: true,    },

至于为什么会导致这个问题,我们先看下深度监听的实现方式:

vue如何实现组件通信

这段注释什么意思呢,简单理解就是vue是通过递归遍历对象里面的每一个属性,将是对象的属性收集起来进行监听。众所周知,递归是很容易引起堆栈溢出的,而看下this对象就不难理解为什么会导致堆栈溢出了(太多了,而且是层层嵌套下去的)。

以上是“vue如何实现组件通信”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: vue如何实现组件通信

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

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

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

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

下载Word文档
猜你喜欢
  • vue如何实现组件通信
    这篇文章主要介绍vue如何实现组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在vue中, 组件的关系不外乎以下三种:组件是需要通信的,在开发中,常用到的通信方式有:vuex、eventBus、以及prop...
    99+
    2023-06-29
  • Vue如何实现组件间通信
    目录1. 父子间通信1.1 父组件 --> 儿子组件1.2 儿子组件 --> 父组件2. 爷孙间通信3. 任意组件间通信3.1 EventBus3.2 Vuex1. 父子...
    99+
    2024-04-02
  • vue组件间通信如何实现
    本篇内容主要讲解“vue组件间通信如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue组件间通信如何实现”吧!父组件传子组件父传子方法(一) 属性传递 props//子组件&l...
    99+
    2023-07-04
  • vue指令如何实现组件通信
    本文小编为大家详细介绍“vue指令如何实现组件通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue指令如何实现组件通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue指令实现组件通信的方法:1、父组件通...
    99+
    2023-07-05
  • 如何用Vue实现父子组件通信
    目录一、父子组件的关系构成二、props三、$emit四、$parent五、总结 一、父子组件的关系构成 本篇文章将要总结的是Vue中父子组件之间的通信方式。 那在vue中父子组件之...
    99+
    2024-04-02
  • Vue如何实现组件间通信方式
    这篇文章主要介绍了Vue如何实现组件间通信方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。props父组件可以通过props向下传递数据给子组件静态的Props通过为子组件...
    99+
    2023-06-29
  • React组件通信如何实现
    这篇文章主要介绍“React组件通信如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React组件通信如何实现”文章能帮助大家解决问题。1. 父子组件通信方式父子组件之间的通信很常见,其中父组...
    99+
    2023-07-05
  • vue中如何实现非父子组件的通信
    这篇文章主要介绍了vue中如何实现非父子组件的通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Provide和InjectProvide和Inject用于非父子组件之间...
    99+
    2023-06-29
  • vue中怎么实现组件间通信
    vue中怎么实现组件间通信,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。父组件传子组件父传子方法(一) 属性传递 props//子组件 &...
    99+
    2024-04-02
  • 怎么在vue中实现组件通信
    怎么在vue中实现组件通信?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度...
    99+
    2023-06-14
  • vue-cli中怎么实现组件通信
    vue-cli中怎么实现组件通信,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一.父传子组件通信拿app.vue当父组件,content.vu...
    99+
    2024-04-02
  • vue指令怎么实现组件通信
    本教程操作环境:Windows10系统、Vue 3版、DELL G3电脑vue指令怎么实现组件通信?Vue实现组件间通信的七种方式1. props / $emit父组件通过props的方式向子组件传递数据,而通过$emit 子组件可以向父组...
    99+
    2023-05-14
    Vue
  • 怎么用eventemitter2实现Vue组件通信
    这篇文章主要讲解了“怎么用eventemitter2实现Vue组件通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用eventemitter2实现Vue组件通信”吧!概述当两个组件之间...
    99+
    2023-07-04
  • Vue实现组件间通信的示例
    这篇文章主要介绍了Vue实现组件间通信的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 父子间通信最常见的就是父子之间的通信,通信是双向的数据传递。1.1 父组件 -...
    99+
    2023-06-15
  • vue组件间如何进行通信
    本篇内容介绍了“vue组件间如何进行通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue是数据驱动视图更新的框架, 我们平时开发,都会把...
    99+
    2023-06-21
  • Vue如何实现父子组件之间的通信功能
    这篇文章主要为大家展示了“Vue如何实现父子组件之间的通信功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue如何实现父子组件之间的通信功能”这篇文章吧。在...
    99+
    2024-04-02
  • React如何实现跨级组件通信
    这篇文章主要介绍React如何实现跨级组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!跨级组件通信假设一个父组件中存在一个子组件,这个子组件中又存在一个子组件,暂且称为“孙组件...
    99+
    2024-04-02
  • React如何实现父子组件通信
    这篇文章主要介绍React如何实现父子组件通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!父子组件通信原理:父组件通过props(与vue中的props区分开)向子组件通信,子组件...
    99+
    2024-04-02
  • vue父子组件间通信怎么实现
    本篇内容介绍了“vue父子组件间通信怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.父组件传递数据给子组件父组件数据如何传递给子组...
    99+
    2023-07-04
  • VUE中如何优雅实现爷孙组件的数据通信
    目录$attrs和$listeners如何使用呢?$attrs的使用:$listeners的使用:总结:在开发的过程中遇到这么个场景,我需要在爷组件中请求数据,请求到的数据呢需要在孙...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作