Vue组件通信方法案例总结

作者:猫老板的豆 时间:2023-07-02 16:51:58 

一、父组件向子组件传值(props)

步骤:

  1. 在父组件中通过 v-bind 将数据传给子组件

  2. 在子组件中通过 props 接收父组件传递过来的数据


<div id="app">
<!-- 1.通过 v-bind 将数据传给子组件 -->
   <test v-bind:ss='name'></test>
</div>

<script>
   var a = new Vue({
       el:'#app',
       data:{
           name:'bing',
       },
       components: {
           test:{
               props: ['ss'],   // 2.接收父组件传递过来的数据
               template:"<p>{{ss}}</p>"
           }
       }
   })
</script>

props使得父子之间形成一种 单向数据流 ,父元素更新的时候,子元素的状态也会随之改变。
但反之会导致你的应用的数据流向难以理解,因此在子组件中不能修改父组件中的数据

二、子组件向父组件传值($emit)

子组件通过 $emit 事件向父组件发送消息,将自己的数据传递给父组件。

步骤:

  1. 在子组件上绑定一个 click 事件,触发 increment 方法

  2. increment 方法中用 $emit 定义一个自定义事件 increment ,同时传入 this.counter 参数

  3. 在父组件上绑定步骤2中自定义的 increment 事件,方法名为 incrementTotal

  4. 在父组件中调用步骤3中的 incrementTotal 方法,这时 incrementTotal 方法就能接收到子组件传入的参数


<div id="app">
   <p>{{ total }}</p>
   <button-counter v-on:increment="incrementTotal"></button-counter> <!-- 步骤3 -->
</div>

<script>
   Vue.component('button-counter', {
       template: '<button v-on:click="increment">{{ counter }}</button>', // 步骤1
       data: function () {
           return {
               counter: '子组件的数据'
           }
       },
       methods: {
           increment: function () {
               this.$emit('increment', this.counter); // 步骤2
           }
       }
   });

new Vue({
       el: '#app',
       data: {
           total: '父组件的数据:'
       },
       methods: {
           incrementTotal: function (e) { // 步骤4
               this.total = this.total + e[0]
               console.log(e);
           }
       }
   })
</script>

三、兄弟组件传值(EventBus)

如果不需要类似 Vuex 这样的库来处理组件之间的数据通信,就可以考虑Vue中的 事件总线(EventBus) 来通信。

在 Vue 中可以使用 EventBus 来作为沟通桥梁的概念,就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件,所以组件都可以上下平行地通知其他组件。
但也就是太方便所以若使用不慎,就会造成难以维护的“灾难”,因此才需要更完善的Vuex作为状态管理中心,将通知的概念上升到共享状态层次。

这个方法是通过创建一个空的 vue 实例,当做 $emit 事件的处理中心(事件总线),通过他来触发以及监听事件,方便的实现了任意组件间的通信,包含父子,兄弟,隔代组件。具体如下:

1. 初始化(new Vue())

首先需要创建事件总线并将其导出,以便其它模块可以使用或者监听它。
我们可以通过两种方式来处理。

方法一: 新创建一个 event-bus.js 文件


// event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()

方法二: 直接在项目中的 main.js 初始化 EventBus


// main.js
Vue.prototype.$EventBus = new Vue() // 注意:这种方式初始化的EventBus是一个全局的事件总线

现在我们已经创建了 EventBus ,接下来你需要做到的就是在你的组件中加载它,并且调用同一个方法,就如你在父子组件中互相传递消息一样。

2. 发送事件($emit())

假设有两个Vue页面需要通信: A 和 B 。A页面中在按钮上面绑定了点击事件,发送一则消息,想通知 B页面。


<!-- A.vue -->
<template>
   <button @click="sendMsg()">-</button>
</template>

<script>
import { EventBus } from "../event-bus.js";
export default {
 methods: {
   sendMsg() {
     EventBus.$emit("aMsg", '来自A页面的消息'); // 对外发送数据
   }
 }
};
</script>

3. 接收事件($on())

接下来,需要在 B页面中接收这则消息。


<!-- B.vue -->
<template>
<p>{{msg}}</p>
</template>

<script>
import { EventBus } from "../event-bus.js";
export default {
data() {
return {
msg: ''
}
},
mounted() {
EventBus.$on("aMsg", (msg) => { // 接收 A 发送来的消息
this.msg = msg;
});
}
};
</script>

4. 移除事件监听者

前面提到过,如果使用不善,EventBus会是一种灾难,到底是什么样的“灾难”了?大家都知道vue是单页应用,如果你在某一个页面刷新了之后,与之相关的EventBus会被移除,这样就导致业务走不下去。还要就是如果业务有反复操作的页面,EventBus在监听的时候就会触发很多次,也是一个非常大的隐患。这时候我们就需要好好处理EventBus在项目中的关系。通常会用到,在vue页面销毁时,同时移除EventBus事件监听。

如果想移除事件的监听,可以像下面这样操作:


import { EventBus } from "../event-bus.js";
EventBus.$off('aMsg', {})

EventBus.$off('aMsg')移除应用内所有对此某个事件的监听。
或者直接调用 EventBus.$off() 来移除所有事件频道,不需要添加任何参数 。

四、Vuex

在做中大型的单页应用的时候,例如需要多人协作开发,全局维护登录状态等,我们最好还是选择vuex来进行状态管理。

vuex详解传送门

来源:https://blog.csdn.net/x550392236/article/details/78500892

标签:vue,通信
0
投稿

猜你喜欢

  • msxml3.dll 错误 '800c0005'终极解决办法

    2009-10-05 18:40:00
  • Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结

    2024-05-28 15:47:20
  • Python列表切片常用操作实例解析

    2023-12-18 03:47:54
  • 解决sql server 数据库,sa用户被锁定的问题

    2024-01-18 23:21:08
  • Python3.8安装tensorflow的简单方法步骤

    2021-03-11 23:31:42
  • Python通过正则库爬取淘宝商品信息代码实例

    2021-12-09 18:49:55
  • Vue-cli配置打包文件本地使用的教程图解

    2024-05-22 10:42:05
  • Python通过kerberos安全认证操作kafka方式

    2022-12-23 21:39:49
  • GDB调试Mysql实战之源码编译安装

    2024-01-28 00:37:42
  • javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来

    2024-04-10 13:58:29
  • 基于ASPJPEG 制作了一个梦寐已久的批量水印工具步骤

    2011-02-28 10:39:00
  • 详解Vue用cmd创建项目

    2024-05-21 10:16:38
  • pytorch visdom安装开启及使用方法

    2023-11-27 06:39:41
  • Python实现炸金花游戏的示例代码

    2022-01-15 05:24:17
  • pytest解读一次请求多个fixtures及多次请求

    2023-07-20 01:13:43
  • 用 python 进行微信好友信息分析

    2022-03-29 15:52:44
  • 如何使用PyCharm引入需要使用的包的方法

    2021-12-22 07:34:56
  • 解决python3中os.popen()出错的问题

    2022-07-20 23:38:48
  • 指导:SQL Server无日志恢复数据库

    2009-02-20 17:07:00
  • 从零开始学Golang的接口

    2023-10-09 02:26:03
  • asp之家 网络编程 m.aspxhome.com