vue组件的数据通信方式很多,本篇汇总所有的方式一起说说,水平有限,不对的话,欢迎指正。
所谓的组件通信,就是一个组件获取另外一个组件的数据或者方法。
先看看所有的方式,8种吧:
props/$emit- 具体使用方式ref/$refs- 具体使用方式slot的作用域 - 具体使用方式eventBus- 具体使用方式vuex- 具体使用方式$attrs/$listeners- 具体使用方式$parent/$children- 具体使用方式provide/inject- 具体使用方式
这么多方式,怎么选择呢。
首先,有个原则性的大判断,是不是在封装组件。
不是封装组件,只是普通使用组件的话
只是普通使用组件,而不是封装组件的话,一般只会用以下方式:
- props/$emit
- ref/$refs
- slot的作用域
- eventBus
- vuex
再继续,是不是父子组件。
父子组件的话:
- 首选,
prop/$emit,必要时结合语法糖.sync和v-model。 - 只想,显示子组件/第三方组件的数据 或者 执行其工具方法,可考虑选择
ref/$refs - 子组件或者第三方组件内部提供了,slot作用域数据的话,自然考虑到
slot方式
跨组件的话:数据不复杂用eventBus,复杂用vuex
封装组件的话
封装组件,甚至嵌套组件的情况下
- 封装第三方组件 或者 一些简单的表单组件,可考虑
$attrs/$listeners - 组件内部嵌套层级不确定,后代组件想要祖先组件数据的话,可考虑
provide/inject - 组件内部嵌套关系明确,且只是显示 上下组件的数据 或者 执行其工具方法,可考虑
$children/$parent
练习
可以用这个,练习下,手写el-form的核心逻辑