vue组件通信大全

安全工
• 阅读 3110

vue组件通信方式很多同学会说我知道,这个简单,props传值,$emit回传,再不行就vuex。但实际上vue组件通信远远不止这些,并不是层级一多就要用vuex,一个项目就要隔多级传几个静态参数,你说我用vuex,我想这就是杀鸡用了宰牛刀,今天就来说一下具体有多少种方式,并且如何应用。

组件通信方式列举

组件通信常用方式

1、props/$emit。
2、event。
3、vuex。

自定义事件
1.边界情况

4、$parent
5、$root
6、$children
7、$refs
8、provide/inject

2.非prop特性

9、$attrs
10、$listeners

组件通信的应用

1.props/$emit
props传值非常简单,这个是最最常用的,我简单写下例子。

父组件给子组件传值

// parent 组件
<Parent msg="Welcome to vue props"/>

// child里面通过props获取msg
props: { msg: String } 

子组件传值给父组件,使用$emit

// child里面调用$emit, 第一个参数是方法名,后面都是参数
this.$emit('add', good) 

// parent,$emit会触发父组件add方法
<Parent @add="parentAdd($event)" />

2.event事件总线
前面说到的props和/$emit父子组件通信,他们存在引入与被引入的关系,如果不存在这种关系我们该怎么办呢?
这时我们常常会用到事件总线或者vuex的方式。

首先在main.js文件中通过vue原型属性初始化EventBus,
这种方式初始化的是一个全局事件总线。

import Vue from 'vue'
import App from './App.vue'

// 事件总线
Vue.prototype.$bus = new Vue()

new Vue({
  render: h => h(App),
}).$mount('#app')

在组件1中发送信息

// 利用事件总线发送事件
this.$bus.$emit('event-from-component1', 'some msg from component1')

在组件2中监听接受信息

this.$bus.$on('event-from-component1', msg => {
    console.log('component2:', msg);
});

这时只要在组件1中触发$bus.$emit的方法,组件2中$bus.$on方法就会调用,控制台就会输出:vue组件通信大全

3.vuex

创建唯一的全局数据管理者store,通过它管理数据并通知组件状态变更。
vuex的强大这里就不赘述了,vuex内容比较多也不是本文的主题,这里就不细讲了,不熟悉的同学先去看下官网:https://vuex.vuejs.org/zh/guide

4.$parent
兄弟组件直接可以通过共同的祖先搭桥联通,$parent和$root都可以做到。

// brother1中发出方法
this.$parent.$emit('event-from-brother1', 'some msg from brother1')`

// brother2中接收方法
this.$parent.$on('event-from-brother1', msg => {
    console.log('brother2:', msg);
});

这时触发brother1中的方法,控制台就会显示:vue组件通信大全

这是兄弟组件通信的方法,我们也可以通过$parent从子组件调用父组件的方法。

// parent里面methods定义了一个方法
methods: {
      fatherMethod() {
        console.log('我是你爹');
      }
    }
    
// children子组件里面调用父组件方法
this.$parent.fatherMethod()

当$parent.fatherMethod()方法在子组件被调用控制台便会打出:我是你爹

5.$root

$root和上面parent类似,这里就不赘述,具体请移步官网。

6.$children

父组件可以通过$children访问子组件实现父子通信,但是父组件可能含有多个子组件,所以要区分开

this.$children[index].xx = 'xxx'
 

但是有一点需要注意$children实际上不能保证子元素的顺序,也不是响应式的。
因为$children是根据你页面加载组件的顺序去确定子组件在 $children数组中的顺序。
如果A组件在B组件先加载,那么A组件的下标就是0,B组件的下标就是1。
如果有动态组件很容易出错,所以我们并不建议使用。
然而我们常用的$refs就可以解决这个问题。

7.$refs
回去节点引用,也就是获取dom

// dom中引入
<div ref="tx" /> 

// 获取上面div的dom从而操作
this.$refs.tx 

在父组件中通过ref调用子组件的方法,这里就不会有$children的顺序问题了,因为ref是一一对应的。

// 父组件
<Child2 ref="child2" msg="some message"></Child2>

// 子组件
methods: {
  sendToChild1() {
    console.log('我是父组件使用ref调用的方法')
  }
},

// 在父组件中调用子组件方法sendToChild1
`this.$refs.child2.sendToChild1()`

8.provide/inject
能够很好的跨层级通信。官网也做比较详细的说明:https://cn.vuejs.org/v2/api/#...
这个方法其实也挺好用的,但是很多同学并没有用过,可能都不是很清楚。
下面我们来具体说一下:

// 祖辈组件中提供了一个变量,这时我们使用provide方法注入
provide() {
  return {
    father: 'father'
  }
},
// 这时我们需要在某个后代元素中获取这个father变量
// 注入之后我们就可以在该后代组件中使用变量father了
inject: ['father']

// inject另外一种写法
// 这时我们需要对变量重命名,同时可以设置默认值
inject: {
  bar1: {
    from: 'father',
    default: 'barrrrrrrr'
  }
}, 

我们也可以把注入值放入我们该后代元素的data中去使用,provide/inject基本用法就是这样的。

9.$attrs
$attrs包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 ( class 和 style 除外)。
当一个组件没有 声明任何 prop 时,这里会包含所有父作用域的绑定 ( class 和 style 除外),并且可以通过 v- bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。

// 爷爷组件中给父亲组件注入信息
<Parent msg="msg" />

// 父亲组件,我们需要在父亲组件中绑定$attr以便于孙子组件获取信息
<Children v-bind="$attrs" />

// 孙子组件:在props中没有声明msg,这时子组件依然能够收到信息
<div> {{$attrs.msg}}</div>

这时孙子组件就可以获取msg的信息了,这里其实都是跨层级通信的。
10.$listeners
如果我们需要从孙子组件调用爷爷组件的方法,实现跨层级通信的话,可以使用到$listeners。

// 爷爷组件
<Parent msg="msg" @foo="onFoo"/>

// 爷爷组件methods设置方法
onFoo() {
    console.log('msg from Children');
}

// 父亲组件,绑定$listeners
<Children v-bind="$attrs" v-on="$listeners" />

// 孙子组件:调用foo方法
this.$emit('foo')

以上内容只是本人的学习总结,紧供参考。

点赞
收藏
评论区
推荐文章
Alex799 Alex799
4年前
vue最新面试题
最近在面试,总结几个重点的面试题:一、vue父子组件之间的传值:简单来说,子组件通过props方法接受父组件传来的值,子组件通过$emit方法来向父组件发送数据。(具体案例可以看我之前写的博客)。二、vue生命周期函数:beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestr
Dax Dax
4年前
veux的使用
1)说说什么是vuex(下定义)2)vuex解决了哪些问题,为什么要用(必要性)3)怎么使用vuex(使用方法)4)描述vuex原理,提升答案深度(深层原理升华答案)vuex的流程图分析:我们可以看到图中虚线框包裹起来的部分就是vuex的三个组成部分(Action,Mutations,state),我们来简单的捋一下整个流程:首先vue的组件在响应用户行为交
Chase620 Chase620
4年前
vue的8种通信方式
1.props/emit1.父组件向子组件传值下面通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中如何获取父组件section.vue中的数据articles:\'红楼梦','西游记','三国演义'\//section父组件<template<divclass"section"
LinMeng LinMeng
3年前
面试题汇总
2021/10/30pfyh1、举例说几个ES6新特性2、map和filter的区别3、浏览器缓存机制4、vue渲染机制5、生命周期钩子函数6、组件传值7、箭头函数的特点/this指向/有没有arguments/如何获取入参8、虚拟DOM树9、Diff算法10、Vuex11、vue的两种路由模式hash和history的特点12、bind,call,appl
Souleigh ✨ Souleigh ✨
4年前
Vuex 4 正式发布:打包现在与 Vue 3 一致
Vuex是一个专门为Vue.js应用程序开发的状态管理模式。Vuex采用集中式存储管理应用的所有组件组件的状态。换句话说,Vuex就是帮开发者存储多个组件共享的数据,方便开发者对其读取的更改的工具。Vuex4正式版本现已发布。Vuex4的改进重点是兼容性。Vuex4支持Vue3,并提供了与Vuex3完全相同的
可莉 可莉
4年前
了解Vuex状态管理模式
1Vuex是什么呢?它是Vue的状态管理模式,在使用vue的时候,需要在vue中各个组件之间传递值是很痛苦的,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被改变,所有引用该值的地方就会自动更新。是不是很方便,很好用呢?vuex是专门为vue.js设计的状态管理模式,集中式存储和管理应用程序中所有组件的状态,vuex也集成了vue的
科林-Colin 科林-Colin
4年前
Vue 组件通信方式及其应用场景总结
前言相信实际项目中用过vue的同学,一定对vue中父子组件之间的通信并不陌生,vue中采用良好的数据通讯方式,避免组件通信带来的困扰。今天笔者和大家一起分享vue父子组件之间的通信方式,优缺点,及其实际工作中的应用场景首先我们带着这些问题去思考1vue中到底有多少种父子组件通信方式?2vue中那种父子组件最佳通信方式是什么?3
爱丽丝13 爱丽丝13
4年前
React 组件通信之发布订阅模式
React通信react的数据流是单向的,react通信有以下几种方式:父向子通信:传入props子向父通信:父组件向子组件传一个函数,然后通过这个函数的回调,拿到子组件传过来的值父向孙通信:利用context传值。React.createContext()兄弟间通信:​1、找一个相同的父组件,既可以用pr
Dax Dax
4年前
Vue父子组件
几种常见的通信方式:1、prop属性父组件通过绑定属性的方式,给子组件传值,同时子组件通过设置props来接收letChildVue.extend(template:'content',props:content:type:String,default:()r
马丁路德 马丁路德
4年前
vue3 - 组件通信
vue3组件通信和vue2的通信方式基本一致,只是存在写法上的差异props/emitsetup函数接收两个参数,props和context(上下文,其中有一个emit)用法展示//父组件<template<ibutton:type'type'@onClick
Stella981 Stella981
3年前
34条我能告诉你的Vue之实操篇
这是我学习整理的关于Vue.js系列文章的第一篇,另外还有两篇分别是关于优化和原理的。希望读完这3篇文章,你能对Vue有个更深入的认识。7种组件通信方式随你选组件通信是Vue的核心知识,掌握这几个知识点,面试开发一点问题都没有。props/@on$emit用于实现父子组件间通信。通过