Skip to content

组件通信

父子组件通信

主流推荐的

Props Down, Events Up
父组件传递数据到子组件,子组件通过自定义事件通知父组件


v-model 语法糖 实现数据双向绑定. 本质上也是 Props Down, Events Up vue 2 的时候还有个.sync实现多个值的双向绑定,vue3 被移除了

js
`v-bind:propName.sync="data"` 也是一个语法糖,它等价于:
`v-bind:propName="data" @update:propName="data = $event"`

vue3 中 v-model:foo="bar" 已经完美替代了 v-bind:foo.sync="bar" 的功能


ref 模板引用 直接拿到子组件实例,访问子组件的属性和方法。

也是一种说法

styleclass
style和class会合并到子组件的根元素中

html
<ChildComponent class='active' style="color: red">

attribute元素属性
子组件默认会继承父组件传过来的所有属性,即便在子组件中没有声明为 props ,也可以在attrs 中拿到所有父组件传递的属性。


$parent,$children 直接获取父组件或子组件的实例,直接操作实例。 vue3 中已不再推荐


插槽和作用域插槽 插槽的主要目的是实现组件内容分发和复用。普通插槽允许父组件在子组件内部插入内容,这些内容可以访问父组件自身的数据和方法(父 -> 子)。作用域插槽允许子组件将其内部的数据暴露给父组件,供父组件定义插槽内容时使用(子 -> 父)。


跨组件通信

Provide 和 Inject

实现祖先与后代的深层次组件通信,实现整体主题、样式的配置以及一些插件开发。

js
// 在父组件中 , provide 一个普通值,响应式对象或一个方法
import { provide } from 'vue'

const appName = ref('My Awesome App');
provide('appName', appName);

const updateTheme = (newColor) => {};
provide('updateTheme', updateTheme);
js
// 子组件中
import { inject } from 'vue'

const appName = inject('appName')
const updateTheme = inject('updateTheme')

const changeTheme = () => {
  if (updateTheme) {
    updateTheme('dark');
  }
};

router

比如一个组件改变了路由,另有一个组件监听该路由并变化,这俩组件之间就是基于 router 进行了通信。

vuex

大型的数据仓库

轻量的 store 模式

适用于中小型的数据仓库,比如我经常写的 ezStore

js
export default {
    store: new Map(),
    set(key, val) {
        store.set(key, val)
    },
    get(ket){
        store.get(key)
    }
}

EventBus 发布订阅模式/观察者模式

通过一个中间总线来管控事件的派发和监听。