iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vue组件间的通讯方式有哪些
  • 610
分享到

Vue组件间的通讯方式有哪些

2023-06-27 10:06:00 610人浏览 安东尼
摘要

本篇内容主要讲解“Vue组件间的通讯方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue组件间的通讯方式有哪些”吧!前言Vue 提供了各种各样的通讯,其中包括兄弟间的通讯和非兄弟间的通

本篇内容主要讲解“Vue组件间的通讯方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue组件间的通讯方式有哪些”吧!

前言

Vue 提供了各种各样的通讯,其中包括兄弟间的通讯和非兄弟间的通讯,借此机会做个总结,查阅起来方便。

1、props

目录结构
components   ├── Parent.vue   // 父亲   ├── Son1.vue     // 儿子1
代码结构

在父亲组件中使用儿子组件,给儿子通过:date="xxx"单向传值

<template>  <div>    <div>爸爸:{{date}}</div>    <Son1 :date="date"></Son1>  </div></template><script>import Son1 from "./son1";export default {  components: { Son1 },  data() {    return {      date: 1,    };  },};</script>

儿子组件通过props接受父组件传过来的值

<template>  <div>儿子:{{date}}</div></template><script>export default {  props: {    date: {      type: Number, //校验类型      default: "1",    },  },};</script>

2、$emit

目录结构
components   ├── Parent.vue   // 父亲   ├── Son1.vue     // 儿子1
代码结构

(推荐教程:Vue 2教程)

子组件通过触自身的方法来触发$emit方法,再触发父组件的方法,通过回调传参的方式将修改的内容传递给父组件

<template>  <div>    <div>儿子:{{date}}</div>    <button @click="changeNum">修改</button>  </div></template><script>export default {  props: {    date: {      type: Number,      default: "1",    },  },  methods: {    changeNum() {      this.$emit("changeNum", 2);    },  },};</script>

父组件接受回调params参数,即爸爸需要给儿子绑定了一个自定义的事件,$on("changeNum",params)

<template>  <div>    <div>爸爸:{{date}}</div>    <Son1 :date="date" @changeNum="changeNum"></Son1>  </div></template><script>import Son1 from "./son1";export default {  components: { Son1 },  data() {    return {      date: 1,    };  },  methods: {    changeNum(params) {      this.date = params;    },  },};</script>

.sync

目录结构
components   ├── Parent.vue   // 父亲   ├── Son1.vue     // 儿子1
代码结构

子组件通过$emit("update:xxx")发射事件

<template>  <div>    <div>儿子:{{date}}</div>    <button @click="changeNum">修改</button>  </div></template><script>export default {  props: {    date: {      type: Number,      default: "1",    },  },  methods: {    changeNum() {      this.$emit("update:date", 2);    },  },};</script>

父组件通过:xxx.sync="xxx"接受参数

<template>  <div>    <div>爸爸:{{date}}</div>    <Son1 :date.sync="date"></Son1>  </div></template><script>import Son1 from "./son1";export default {  components: { Son1 },  data() {    return {      date: 1,    };  },};</script><Son1 :date.sync="date"></Son1>//这个写法是上面的替代品 默认组件内部触发 update:count 规定写法<Son1 :date="date" @update:date="val=>date=val"></Son1>

v-model

目录结构
components   ├── Parent.vue   // 父亲   ├── Son1.vue     // 儿子1
代码结构

子组件触发的事件只能是input事件,接收props的属性名只能叫value

<template>  <div>    <div>儿子:{{value}}</div>    <button @click="changeNum">修改</button>  </div></template><script>export default {  props: {    value: {      type: Number,      default: 1,    },  },  methods: {    changeNum() {      this.$emit("input", 2);    },  },};</script>

父组件通过v-model接收参数

<template>  <div>    <div>爸爸:{{value}}</div>    <Son1 v-model="value"></Son1>  </div></template><script>import Son1 from "./son1";export default {  components: { Son1 },  data() {    return {      value: 1,    };  },};</script><Son1 :value="value" @input="val=>value=val"></Son1>//这个写法是上面的替代品 默认组件内部触发 input 规定写法<Son1 v-model="value"></Son1>
<br> v-model` 局限只能传递一个属性 如果只有一个 可以使用`v-model` 多个依然需要使用`.sync<br> ```

3、$parent和 $children

目录结构
components   ├── Parent.vue   // 父亲   ├── Son1.vue     // 儿子1   ├── Grandson1.vue  //孙子1
代码结构

如下场景:孙子想要给爷爷传递数据,孙子需要找到爷爷身上的事件去传递$parent.$emit

<template>  <div>    <div>孙子{{value}}</div>    <button @click="$parent.$emit('change',3)">修改</button>  </div></template><script>export default {  props: {    value: {      type: Number,      default: "",    },  },};</script>

儿子组件使用孙子组件

<template>  <div>    <div>儿子:{{value}}</div>    <grandson1 :value="value"></grandson1>  </div></template><script>import grandson1 from "./grandson1";export default {  components: {    grandson1,  },  props: {    value: {      type: Number,      default: 1,    },  },};</script>

爸爸身上给孙子自定义change事件

<template>  <div>    <div>爸爸:{{value}}</div>    <Son1 @change="val=>value=val" :value="value"></Son1>  </div></template><script>import Son1 from "./son1";export default {  components: { Son1 },  data() {    return {      value: 1,    };  },};</script>

如果层级很深那么就会出现$parent.$parent.....我们可以封装一个$dispatch方法向上进行派发

Vue.prototype.$dispatch = function $dispatch(eventName, data) {  let parent = this.$parent;  while (parent) {    parent.$emit(eventName, data);    parent = parent.$parent;  }};

相同的道理,如果既然能够向上寻找父亲,就能向下寻找儿子,也可以封装一个向下派发的方法$broadcast

Vue.prototype.$broadcast = function $broadcast(eventName, data) {  const broadcast = function () {    this.$children.forEach((child) => {      child.$emit(eventName, data);      if (child.$children) {        $broadcast.call(child, eventName, data);      }    });  };  broadcast.call(this, eventName, data);};

4、$attrs和 $listeners

目录结构
components   ├── Parent.vue   // 父亲   ├── Son1.vue     // 儿子1   ├── Grandson1.vue  //孙子1

$attrs批量向下传入属性

<template>  <div>    <div>爸爸:{{value}}</div>    <Son1 @change="val=>value=val" :value="value"></Son1>  </div></template><script>import Son1 from "./son1";export default {  components: { Son1 },  data() {    return {      value: 1,    };  },};</script>

在儿子组件中使用 $attrs 属性,配合v-bind可以将属性继续向下传递

<template>  <div>    <div>儿子:{{$attrs.value}}</div>    <grandson1 v-bind="$attrs"></grandson1>  </div></template><script>import grandson1 from "./grandson1";export default {  components: {    grandson1,  },  mounted() {    console.log(this.$attrs);  },};</script>

注意一点:在使用 $attrs 的时候,如果组件中使用了props 就会将属性从当前 attrs移除掉

在孙子组件中使用 $attrs属性,可以将属性继续向下传递

<template>  <div>    <div>孙子{{$attrs.value}}</div>  </div></template><script>export default {  //props: {  //  value: Number,  //},  mounted() {    console.log(this.$attrs);  },};</script>

如果爸爸传递给儿子元素, 儿子有三个属性用不到, 孙子传递给孙子,但是不想在页面上这个属性,可以设置inheritAttrs: false

$listeners批量向下传入方法

<template>  <div>    <div>爸爸:{{value}}</div>    <Son1 @click="change" :value="value"></Son1>  </div></template><script>import Son1 from "./son1";export default {  components: { Son1 },  data() {    return {      value: 1,    };  },  methods: {    change() {      this.value = 2;    },  },};</script>

可以在 son1 组件中使用$listeners属性,配合v-on可以将方法继续向下传递

<template>  <div>    <div>儿子:{{$attrs.value}}</div>    <grandson1 v-bind="$attrs" v-on="$listeners"></grandson1>  </div></template><script>import grandson1 from "./grandson1";export default {  components: {    grandson1,  },  mounted() {    console.log(this.$attrs);    console.log(this.$listeners);  },};</script>

孙子组件可以直接使用$listeners上的方法

<template>  <div>    <div>孙子{{$attrs.value}}</div>    <button @click="$listeners.click"></button>  </div></template><script>export default {  mounted() {    console.log(this.$attrs);    console.log(this.$listeners);  },};</script>

5、Provide & Inject

目录结构
app.vuecomponents   ├── Parent.vue   // 父亲   ├── Son1.vue     // 儿子1   ├── Grandson1.vue  //孙子1
代码结构

在父级声明一个公共数据

export default {  provide() {    return { vm: this };  },};

在子组件中可以注入原理,会将数据挂载在当前实例上

<template>  <div>    <div>孙子</div>  </div></template><script>export default {  inject: ["vm"],  mounted() {    console.log(this);  },};</script>

Vue组件间的通讯方式有哪些

注意事项:这个方法使用之后比较混乱,它一般不会在业务代码中使用,经常是在组件库或者多级通信,为了方便你可以使用provide

6、ref

目录结构
components   ├── Parent.vue   // 父亲   ├── Son1.vue     // 儿子1
代码结构

ref获取的是真实的 dom 元素,如果放到组件上代表的是当前组件的实例。父组件中可以直接获取子组件的方法或者数据。

<template>  <div>    <div>爸爸</div>    <Son1 ref="son"></Son1>  </div></template><script>import Son1 from "./son1";export default {  components: { Son1 },  mounted() {    this.$refs.son.show();  },};</script><template>  <div>    <div>儿子</div>  </div></template><script>export default {  methods: {    show() {      console.log(1);    },  },};</script>

注意事项:ref不要重名, 但是当且仅当使用v-for的时候会导致出现数组情况

7、EventBus

目录结构
main.jscomponents   ├── Grandson1.vue   // 孙子1   ├── Son2.vue     // 儿子2
代码结构

EventBus可用于跨组件通知(不复杂的项目可以使用这种方式)

Vue.prototype.$bus = new Vue();

Grandson1 组件和Son2相互通信

<template>  <div>孙子1</div></template><script>export default {  mounted() {    this.$nextTick(() => {      this.$bus.$emit("test", "Go");    });  },};</script>

这里的儿子 2 组件只能使用$on来触发 Grandson1 组件事件

<template>  <div>儿子2</div></template><script>export default {  mounted() {    this.$bus.$on("test", (data) => {      console.log(data);    });  },};</script>

8、Vuex

Vuex 是一个专为 vue.js 应用程序开发的状态管理模式。

到此,相信大家对“Vue组件间的通讯方式有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Vue组件间的通讯方式有哪些

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

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

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

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

下载Word文档
猜你喜欢
  • Vue组件间的通讯方式有哪些
    本篇内容主要讲解“Vue组件间的通讯方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue组件间的通讯方式有哪些”吧!前言Vue 提供了各种各样的通讯,其中包括兄弟间的通讯和非兄弟间的通...
    99+
    2023-06-27
  • Vue中实现组件间通讯的方式有哪些
    这篇文章主要讲解了“Vue中实现组件间通讯的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue中实现组件间通讯的方式有哪些”吧!1.那些场景需要通讯?由于 Vue 所有的组件呈现...
    99+
    2023-06-30
  • vue组件之间通信方式有哪些
    这篇文章将为大家详细讲解有关vue组件之间通信方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:对于vue来说,组件之间的消息传递是非常重要的,下面是我对...
    99+
    2024-04-02
  • Vue实现组件间通信的方式有哪些
    本篇内容主要讲解“Vue实现组件间通信的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue实现组件间通信的方式有哪些”吧!1、Props 父 >>> 子&...
    99+
    2023-06-25
  • vue中实现组件间通信的方式有哪些
    这篇文章给大家介绍vue中实现组件间通信的方式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。方法一、 props / $emit父组件A通过props的方式向子组件B传递,B t...
    99+
    2024-04-02
  • Vue组件间通信的方法有哪些
    这篇“Vue组件间通信的方法有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue组件间通信的方法有哪些”文章吧。方法一...
    99+
    2023-07-05
  • vue组件通信方式有哪些
    vue中实现组件通信的方式有:1.通过props传递实现组件通信;2.使用ref设置父子组件实现组件通信;3.使用parent创建兄弟组件通信侨联实现组件通信;4.使用provide与inject定义祖后代组件实现组件通信;vue中实现组件...
    99+
    2024-04-02
  • Vue组件间通信有哪几种方式
    这篇文章将为大家详细讲解有关Vue组件间通信有哪几种方式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vue 组件间通信有哪几种方式?Vue 组件间通信是面试常考的知识点...
    99+
    2024-04-02
  • Vue中的组件通信方式有哪些
    Vue中的组件通信方式有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。vue组件中关系说明:如上图所示, A与B、A与C、...
    99+
    2024-04-02
  • React组件间通信方式有哪些
    这篇文章主要介绍React组件间通信方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!组件间通信方式总结父组件 => 子组件:PropsInstance Methods子组件 => 父组件:Call...
    99+
    2023-06-06
  • vue中有哪些组件通信方式
    这篇文章将为大家详细讲解有关vue中有哪些组件通信方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. props和$emit这是最最常用的父子组件通信方...
    99+
    2024-04-02
  • Vue常用的组件通信方式有哪些
    本篇文章和大家了解一下Vue常用的组件通信方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。组建通信的基本模式:父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子...
    99+
    2023-06-14
  • vue中有哪些实现组件通信的方式
    本篇文章给大家分享的是有关vue中有哪些实现组件通信的方式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。vue组件中关系说明:如上图所示, A...
    99+
    2024-04-02
  • vue组件之间相互传值的方式有哪些
    这篇文章给大家分享的是有关vue组件之间相互传值的方式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述我们都知道 Vue 作为一个轻量级的前端框架,其核心就是组件化开发。Vue 就是由一个一个的组件构成的...
    99+
    2023-06-15
  • vue组件通信有哪几种方式
    vue中组件通信的方式有:1.使用props/$emit实现父子组件通信;2.使用$refs/$parent/$children/$root实现父子组件通信;3.使用$attrs/$listener实现隔代组件通信;4.使用provide/...
    99+
    2024-04-02
  • Vue3中组件通讯的方法有哪些
    这篇文章主要讲解了“Vue3中组件通讯的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3中组件通讯的方法有哪些”吧!Props父组件传值给子组件(简称:父传子)Props 文...
    99+
    2023-07-02
  • Vue组件间的通信方式详析
    目录前言组件之间通信的场景父子组件之间的通信父组件通过 prop 向子组件传递数据子组件通过自定义事件向父组件传递数据兄弟组件之间的通信状态提升隔代组件之间的通信attrs/attr...
    99+
    2024-04-02
  • Vue3的组件通信方式有哪些
    本篇内容主要讲解“Vue3的组件通信方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3的组件通信方式有哪些”吧!Props父组件传值给子组件(简称:父传子)Props 文档父组件/...
    99+
    2023-06-29
  • React组件间通信的方法有哪些
    这篇文章给大家分享的是有关React组件间通信的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、父子组件通信原理:父组件通过props(与vue中的props区分开)向子组件通信,子组件通过回调事件与...
    99+
    2023-06-25
  • vue中组件间相互通信传值的方法有哪些
    这篇文章主要讲解了“vue中组件间相互通信传值的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中组件间相互通信传值的方法有哪些”吧!vue中组件之间相互通讯传值的方式我们在使...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作