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

vue中非父子组件的通信你了解吗

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

vue中非父子组件的通信你了解吗

我们总结了父子组件通信方式有:props + emit。这里我们将总结一下,非父子组件通信方式,这里还不涉及到Vuex。

如果存在祖孙组件,我们可以通过ProvideInject进行通信。

如果不是祖孙组件,也不是父子组件,我们可以采用Mitt全局事件总线第三方库来实现。

一、Provide和Inject

ProvideInject用于非父子组件之间共享数据,比如有一些深度嵌套的组件,子组件想要获取父组件的数据,如果不存在Provide和Inject选项,我们可以通过props进行一次传递数据,但是这样做太过于繁琐。

对于上述情况,我们可以使用ProvideInject无论组件结构嵌套有多深,父组件都可以作为子组件数据的提供者。

父组件存在Provide来提供数据。

子组件存在Inject来获取数据。

在实际过程中,父组件不知道哪个子组件使用其数据,子组件也不知道使用的是哪个父组件的数据。

Provide和Inject的基本使用

//父组件
<template>
  <div>
    <Content></Content>
  </div>
</template>
<script>
import Content from "./components/Content.vue";
export default {
  data() {
    return {};
  },
  provide:{
    name:"张三",
    age:20
  },
  components: {
    Content
  }
};
</script>
<style scoped></style>
//子组件
<template>
  <div>
    <h1>这里是Content组件</h1>
    <h1>{{ name }} -- {{age}}</h1>
    <ContentBase></ContentBase>
  </div>
</template>
<script>
import ContentBase from "./ContentBase.vue";
export default {
  data() {
    return {};
  },
  components: {
    ContentBase
  },
  inject:["name", "age"]
};
</script>
<style scoped></style>
//孙组件
<template>
  <div>
      <h1>这里是contentBase组件</h1>
      <h1>{{name}} -- {{age}}</h1>
  </div>
</template>
<script>
export default {
  data() {
    return {};
  },
  inject: ["name", "age"]
};
</script>
<style scoped>
</style>

最终显示结果为:

在这里插入图片描述

二、Provide和Inject的另一种写法

我们思考一种情况,如果Provide拿到的数据,是从data拿到的数据,此时如果获取? 此时this可以使用吗?

<template>
  <div>
    <Content></Content>
  </div>
</template>
<script>
import Content from "./components/Content.vue";
export default {
  data() {
    return {
      source: ["111","222", "333"]
    };
  },
  provide:{
    name:"张三",
    age:20,
    res: this.source.length   //我们在此时增加res,想要通过this.source.length拿到数组的长度
  },
  components: {
    Content
  }
};
</script>
<style scoped></style>

该结果是错误的。

在这里插入图片描述

报错信息显示,我们从undefined上读取属性,此时this为undefined。原因:从上面代码我们可以看出,this指向的是undefiend(因为this执行最外层)。

解决方法

我们将Provide设置为一个函数,并且返回一个对象,如下代码所示:

<template>
  <div>
    <Content></Content>
  </div>
</template>
<script>
import Content from "./components/Content.vue";
export default {
  data() {
    return {
      source: ["111", "222", "333"],
    };
  },
  provide() {
    return {
      name: "张三",
      age: 20,
      res: this.source.length,
    };
  },
  components: {
    Content,
  },
};
</script>
<style scoped></style>

显示结果:

在这里插入图片描述

此时我们再思考一个问题,如果我们向data数组中新增一个元素,在其他地方获取的数组长度会跟随变化吗?

<template>
  <div>
    <Content></Content>
    <button @click="addOneItem">点击</button>
  </div>
</template>
<script>
import Content from "./components/Content.vue";
export default {
  data() {
    return {
      source: ["111", "222", "333"],
    };
  },
  provide() {
    return {
      name: "张三",
      age: 20,
      res: this.source.length,
    };
  },
  components: {
    Content,
  },
  methods:{  //在这里添加点击事件
    addOneItem() {
      this.source.push("nnn")
      console.log(this.source)
    }
  }
};
</script>
<style scoped></style>

在这里插入图片描述

在这里插入图片描述

结果如上图所示,可以看到数据是被添加进去的,但是子组件并没有检测到数据的变化。

此时我们可以使用computed来检测this.source.length的变化,使用代码如下所示。

<template>
  <div>
    <Content></Content>
    <button @click="addOneItem">点击</button>
  </div>
</template>
<script>
import Content from "./components/Content.vue";
import { computed } from "vue"   //从vue中引入computed
export default {
  data() {
    return {
      source: ["111", "222", "333"],
    };
  },
  provide() {
    return {
      name: "张三",
      age: 20,
      res: computed(() => this.source.length), //在这里添加computed
    };
  },
  components: {
    Content,
  },
  methods:{
    addOneItem() {
      this.source.push("nnn")
      console.log(this.source)
    }
  }
};
</script>
<style scoped></style>

在这里插入图片描述

在这里插入图片描述

因为我们通过computed获取的是一个对象,此时我们通过value属性拿到值。

三、全局事件总线mitt库

在vue2时,如果我们使用事件总线可以使用this.$bus = new Vue()也就是实例化一个vue对象。但是我们在vue3中不能这样用。所以我们采用第三方库来实现组件之间的通信。这个第三方库为mitt

一、安装

npm install mitt

在文件中引入并且进行初始化导出。

import mitt from "mitt";
const emitter = new mitt()
export default emitter

监听事件,第一个参数是事件名,第二个参数是回调函数。

    emitter.on("why", (data) => {
      console.log(data)
    })
    //*表示可以监听全部的事件。
    emitter.on("*", (type, data) => {
      console.log(type, data)
    })

在这里插入图片描述

取消事件

//取消emitter中所有的监听
emitter.all.clear()
//或者
//定义一个函数
function onFoo(){}
emitter.on("foo", onFoo)
emitter.on("foo", onFoo)

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!   

免责声明:

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

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

vue中非父子组件的通信你了解吗

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

下载Word文档

猜你喜欢

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

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

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

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

VUE父子组件通信的七宗罪:你犯了几个?

VUE父子组件通信是开发中经常遇到的问题,本文列举常见的七种错误,帮助大家避免坑。
VUE父子组件通信的七宗罪:你犯了几个?
2024-02-07

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

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

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

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

浅析Vue中父子组件间怎么通信(父传子|子传父)

Vue中父子组件间怎么通信?下面本篇文章给大家介绍一下父传子和子传父的方法,希望对大家有所帮助!
2022-11-22

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

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

父子聊通讯:揭秘 VUE 父子组件通信的那些事儿

本文将深入解析VUE父子组件通信的原理和实现方式,并通过代码示例展示如何使用props、$emit、ref、$children和$parent实现父子组件间的通信。
父子聊通讯:揭秘 VUE 父子组件通信的那些事儿
2024-02-07

VUE父子组件通信的108个姿势,你试过几个?

VUE父子组件通信是VUE框架中常用的技术,它允许父子组件之间传递数据和事件。本文将介绍VUE父子组件通信的108种姿势,帮助开发者更好地理解和使用该技术。
VUE父子组件通信的108个姿势,你试过几个?
2024-02-07

编程热搜

目录