vue组件间通信方式

460 阅读2分钟

props/ $emit

1. 父组件向子组件传值

  • 子组件在props中创建一个属性,用来接收父组件传过来的值;
  • 父组件中注册子组件;
  • 在子组件标签中添加绑定子组件props中创建的属性;
  • 把需要传给子组件的值赋给该属性。

props只可以从上一级组件传递到下一级组件(父子组件),即所谓的单向数据流。而且props只读,不可被修改,所有修改都会失效并警告。

2. 子组件向父组件传值

  • 子组件中需要一某种方式(例如点击事件)来触发一个自定义事件;
  • 将需要传的值作为this.$emit的第二个参数,该值将作为实参传给响应自定义事件的方法;
  • 在父组件中注册子组件并在子组件标签上绑定对自定义事件的监听

$children / $parent

子实例可以用 this.parent访问父实例,子实例被推入父实例的parent访问父实例,子实例被推入父实例的children数组中。

用于父子组件之间的通信,使用props进行父子组件通信更加普遍;二者既不能用于非父子组件之间的通信。

provide/ inject

provide/ injectvue2.2.0新增的api, 简单来说就是父组件中通过provide来提供变量, 然后再子组件中通过inject来注入变量。

注意: 这里不论子组件嵌套有多深, 只要调用了 inject 那么就可以注入 provide 中的数据,而不局限于只能从当前父组件的props属性中回去数据

ref / refs

ref: 如果在普通的DOM元素上使用,引用指向的就是DOM元素;如果用在子组件上,引用就指向组件实例,可以通过实例直接调用组件的方法或访问数据。

eventBus

eventBus又称为事件总线,在vue中可以使用它来作为沟通桥梁,就像是所有组件共用相同的事件中心,可以向该中心注册或接收事件,所有组件都可以通知其他组件。

  • 创建一个事件总线,例如eventBus.js,new一个vue对象并向外暴露,用它作为通信桥梁。

  • 在需要传值的组件中引入eventBus.js(import {bus} from './eventBus.js'),用bus.$emit()触发一个自定义事件,并传递参数;

  • 在需要接收数据的组件中引入eventBus.js,在mounted()钩子函数(挂载实例)中用bus.$on监听自定义事件,并在回调函数中处理传递过来的参数。

当项目较大,就容易造成难以维护的灾难

Vuex

Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相同的规则保证状态以一种可预测的方式发生变化。简单来说就是:应用遇到多个组件共享状态时,就使用Vuex;

场景: 多个组件共享数据或者跨组件传递数据时。

Vuex各个模块

  • state:用于数据的存储,是store中的唯一数据源;
  • getter:如vue中的计算属性一样,基于state数据的二次包装,常用于数据的筛选和多个数据的相关性计算。
  • mutations:类似函数,改变state数据的唯一途径,且不能用于处理异步事件
  • actions:类似于mutation,用于提交mutations来改变状态,而不直接变更状态,可以包含任意异步操作;
  • modules:类似于命名空间,用于项目中将各个模块的状态分开定义和操作,便于维护。