我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue非父子组件之间的通信方式详解

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue非父子组件之间的通信方式详解

非父子组件的通信

此篇讲解的是, 在学习状态管理之前, 非父子间通信的方案

在开发中,我们构建了组件树之后,除了父子组件之间的通信之外,还会有非父子组件之间的通信

这里我们主要讲两种方式

  • Provide/Inject;
  • 全局事件总线;

1.Provide和Inject

1.1基本使用

Provide/Inject用于非父子组件之间共享数据

  • 比如有一些深度嵌套的组件,子组件想要获取父组件的部分内容;
  • 在这种情况下,如果我们仍然将props沿着组件链逐级传递下去,就会非常的麻烦;

对于这种情况下,我们可以使用 Provide 和 Inject

  • 无论层级结构有多深,父组件都可以作为其所有子组件的依赖提供者;
  • 父组件有一个 provide 选项来提供数据;
  • 子组件有一个 inject 选项来开始使用这些数据;

实际上,你可以将依赖注入看作是“long range props”,除了

  • 父组件不需要知道哪些子组件使用它 provide 的 property
  • 子组件不需要知道 inject 的 property 来自哪里

我们开发一个下面这样的结构: 让App.vue提供一些数据给HomeContent.vue使用[外链图片转存失败,

在祖先组件中通过provide将数据传出, provide对应的是一个对象

export default {
  components: {
    Home
  },
  // 通过provide将数据传出
	provide() {
		return {
			name: this.name,
			age: this.age,
			height: this.height
		}
	}
}

在后代元素中, 通过inject接收祖先传递的数据, inject对应的是一个数组

export default {
  inject: ["name", "age", "height"]
}

1.2处理响应式数据(了解)

我们先来验证一个结果:如果我们修改了this.names的内容,那么使用length的子组件会不会是响应式的?

<template>
  <div class="app">
    <home />
    <h2>{{ name }}</h2>
    <button @click="btnClick">按钮</button>
  </div>
</template>

<script>
  import Home from './Home.vue'

  export default {
    components: {
      Home
    },
    data() {
      return {
        name: "chenyq",
        age: 18,
        height: 1.88,
      }
    },
    // 通过provide将数据传出
    provide() {
      return {
        name: this.name,
        age: this.age,
        height: this.height
      }
    },
    methods: {
      btnClick() {
        this.name = "kaisa"
      }
    },
  }
</script>

我们会发现对应的子组件中是没有反应的

这是因为当我们修改了names之后,之前在provide中引入的 this.name 本身并不是响应式的

那么怎么样可以让我们的数据变成响应式的呢?

  • 非常的简单,我们可以使用响应式的一些API来完成这些功能,比如说computed函数;
  • 当然,这个computed是vue3的新特性,在后面我会专门讲解,这里大家可以先直接使用一下;
import { computed } from 'vue'

export default {
  components: {
    Home
  },
  data() {
    return {
      name: "chenyq",
      age: 18,
      height: 1.88,
    }
  },
  // 通过provide将数据传出
  provide() {
    return {
      name: computed(() => this.name),
      age: this.age,
      height: this.name
    }
  },
  methods: {
    btnClick() {
      this.name = "kaisa"
    }
  },
}

注意:我们在使用name的时候需要获取其中的value

这是因为computed返回的是一个ref对象,需要取出其中的value来使用;

<template>
  <div class="home-content">
    <h2>名字: {{ name.value }}, 年龄: {{ age}}, 身高: {{ height}}</h2>
  </div>
</template>

2.全局事件总线

Vue3从实例中移除了 o n 、 on、 on、off 和 $once 方法,所以我们如果希望继续使用全局事件总线,要通过第三方的库

  • Vue3官方有推荐一些库,例如 mitt 或 tiny-emitter, 这两个库虽然不再维护, 但还是可以使用的;
  • 这里我们主要讲解一下 hy-event-store 的使用, 是前端大神coderwhy封装的他自己的库;

首先,我们需要先安装这个库npm install hy-event-store

其次,我们可以封装一个工具eventbus.js

import { HyEventBus } from "hy-event-store";
const eventBus = new HyEventBus()
export default eventBus

在项目中导入后可以使用它们

  • 我们在App.vue中监听事件;
  • 我们在Banner.vue中触发事件;

Banner中触发事件:

<template>
  <div class="home-content">
    <button @click="btnClick">按钮</button>
  </div>
</template>

<script>
  import eventBus from './utils/event-bus'

  export default {
    methods: {
      btnClick() {
        console.log("myEvent事件被监听")
				// 发送事件到事件总线上
        eventBus.emit("myEvent", "chenyq", 18, 1.88)
      }
    },
  }
</script>

App中监听事件:

<script>
  import eventBus from './utils/event-bus'
  import Home from './Home.vue'

  export default {
    components: {
      Home
    },
    created() {
			// 监听事件总线上的事件
      eventBus.on("myEvent", (name, age, height) => {
        console.log(name, age, height)
      })
    },
  }
</script>

总结

到此这篇关于Vue非父子组件之间的通信方式的文章就介绍到这了,更多相关Vue非父子组件通信内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

Vue非父子组件之间的通信方式详解

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

下载Word文档

猜你喜欢

web前端:Vue非父子组件之间的通信

编程学习网:总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。
web前端:Vue非父子组件之间的通信
2024-04-23

Vue组件通信之父传子与子传父详细讲解

这篇文章主要介绍了React中父子组件通信详解,在父组件中,为子组件添加属性数据,即可实现父组件向子组件通信,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
2022-11-13

Vue父子组件之间事件通信示例解析

这篇文章主要介绍了React中父子组件通信详解,在父组件中,为子组件添加属性数据,即可实现父组件向子组件通信,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
2023-03-19

Vue实现非父子组件通信的方法是什么

本篇内容介绍了“Vue实现非父子组件通信的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!组件是Vue核心的一块内容,组件之间的通信
2023-07-04

vue中如何实现非父子组件的通信

这篇文章主要介绍了vue中如何实现非父子组件的通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Provide和InjectProvide和Inject用于非父子组件之间
2023-06-29

vue组件间的通信,子组件向父组件传值的方式汇总

这篇文章主要介绍了vue组件间的通信,子组件向父组件传值的方式汇总,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-20

Vue父子组件之间事件通信怎么实现

这篇“Vue父子组件之间事件通信怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue父子组件之间事件通信怎么实现”文
2023-07-05

Vue中父子组件间怎么通信的

本篇内容主要讲解“Vue中父子组件间怎么通信的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue中父子组件间怎么通信的”吧!Vue父子组件什么是父子组件?在一个组件中引入另一个组件,被引入的就
2023-06-21

Vue组件的父子通信与兄弟通信实现方式

Vue组件通信分为父子通信和兄弟通信。父子通信通过props将数据从父组件传递给子组件,通过$emit触发子组件事件由父组件监听。兄弟通信可以使用Vuex共享全局状态,或使用EventBus广播和订阅事件。
Vue组件的父子通信与兄弟通信实现方式
2024-04-02

vue组件间的通信,子组件向父组件传值的方式是什么

今天小编给大家分享一下vue组件间的通信,子组件向父组件传值的方式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、子
2023-07-05

Vue中父子组件间通信的方法是什么

这篇文章主要讲解了“Vue中父子组件间通信的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue中父子组件间通信的方法是什么”吧!1、父组件传递给子组件父组件传递给子组件:通过pr
2023-07-04

vue父子组件进行通信方式是怎样的

这篇文章主要介绍“vue父子组件进行通信方式是怎样的”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue父子组件进行通信方式是怎样的”文章能帮助大家解决问题。如图所示,父组件向子组件传递数据,可以通
2023-06-29

Vue3父子组件间传参通信的四种方式

近期学习vue3的父子组件之间的传值,发现跟vue2的并没有太大的区别,下面这篇文章主要给大家介绍了关于Vue3父子组件间传参通信的四种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-19

编程热搜

目录