几种罕见的Vue组件间的传参体式格局
Vue父子组件通讯的要领实在有许多,本文只是做一个总结,说说他们的优瑕玷,详细怎样运用相干文档和网上大神已总结的许多里,这里就不再申明。
1.Vuex
引见
Vuex 是一个专为 Vue.js 运用程序开辟的状况治理模式。它采纳集中式存储治理运用的一切组件的状况,
并以相应的划定规矩保证状况以一种可展望的体式格局发生变化。Vuex 也集成到 Vue 的官方调试东西 devtools extension,
供应了诸如零设置的 time-travel 调试、状况快照导入导出等高等调试功用。
vuex是我日常平凡项目里经常常使用的东西之一,置信人人在项目中一定也常常会运用它
运用要领
请参考官网传送门
优瑕玷
长处
- 处理了多层组件之间烦琐的事宜流传。
- 处理了多组件依靠统统一状况的题目。
- 单向数据流
- 为Vue量身定做,进修本钱不高
瑕玷
- 不能做数据耐久化,革新页面就要重制,要做数据耐久化能够斟酌运用localstorage。
- 增添分外的代码体积,简朴的营业场景不发起运用。
2.EventBus
引见
经由过程同享一个vue实例,运用该实例的$on以及$emit完成数据通报。
运用要领
下面是简朴的运用要领
// bus.js
import Vue from 'vue'
export default new Vue({})
// component-a.js
import bus from './bus.js'
export default {
created () {
bus.$on('event-name', (preload) => {
// ...
})
}
}
// component-b.js
import bus from './bus.js'
export default {
created () {
bus.$emit('event-name', preload)
}
}
优瑕玷
长处
- 处理了多层组件之间烦琐的事宜流传。
- 运用道理非常简朴,代码量少。
瑕玷
由因而都运用一个Vue实例,所以轻易涌现反复触发的情形,比方:
- 多人开辟时,A、B两个人定义了统一个事宜名。
- 两个页面都定义了统一个事宜名,而且没有用$off烧毁(常涌现在路由切换时)。
- 在for出来的组件里注册。
- 项目一大用这类体式格局治理事宜会非常杂沓,这时刻发起用vuex。
3.props和\$emit/\$on
引见
最基本的父组件给子组件通报数据体式格局,将我们自定义的属性传给子组件,子组件经由过程$emit要领,触发父组件v-on的事宜,从而完成子组件触发父组件要领
运用要领
优瑕玷
长处
- 运用最为简朴,也是父子组件通报最罕见的要领。
- Vue为给props供应了范例搜检支撑。
- $emit不会修改到别的组件的同名事宜,由于他只能触发父级的事宜,这里和event-bus差别
瑕玷
- 单一组件层级一深须要逐层通报,会有许多不必要的代码量。
- 不能处理了多组件依靠统统一状况的题目。
Tips
\$attrs/\$listeners能够将父组件的props和事宜监听器继续给子元素,在子组件能够挪用到父组件的事宜和props
4.provide/inject
引见
在父组件上经由过程provide供应给子女组件的数据/要领,在子女组件上经由过程inject来吸收被注入的数据/要领。
运用要领
优瑕玷
长处
- 不必像props一层层通报,能够跨层级通报。
瑕玷
- 用这类体式格局通报的属性黑白相应式的,所以尽可能来通报一些静态属性。
- 援用官网的话是
它将你的运用以现在的组件构造体式格局耦合了起来,使重构变得越发难题。
,我对这句话的明白是用了provide/inject你就要遵照它的组件构造体式格局,在项目的重构时假如要损坏这个构造体式格局会有分外的开辟本钱,实在event-bus也有这个题目。
5.slot
引见
你能够在组件的html模版里增加自定义内容,这个内容能够是任何代码模版,就像:
<navigation-link url="/profile">
<!-- 增加一个 Font Awesome 图标 -->
<span class="fa fa-user"></span>
Your Profile
</navigation-link>
父组件模板的一切东西都会在父级作用域内编译;子组件模板的一切东西都会在子级作用域内编译。
你也能够经由过程slot-scope
属性来完成从子组件将一些信息通报给父组件,注重这个属性是vue2.1.0+新增的。
运用要领
优瑕玷
长处
- 能够在父组件里自定义插进去到子组件里的内容,虽然其他属性也能够,然则我以为slot更倾向于自定义的前提是来自于父容器中。
- 复用性好,适合做组件开辟。
瑕玷
- 和props一样不支撑跨层级通报。
6.\$parent/\$children
引见
经由过程\$parent/\$children能够拿到父子组件的实例,从而挪用实例里的要领,完成父子组件通讯。并不引荐这类做法。
运用要领
经由过程this.$parent
或许this.$children
拿到父或子组件实例。官方传送门
优瑕玷
长处
- 能够拿到父子组件实例,从而具有实例里的一切属性。
瑕玷
- 用这类要领写出来的组件非常难保护,由于你并不知道数据的泉源是那里,有悖于单向数据流的准绳
-
this.$children
拿到的是一个数组,你并不能很正确的找到你要找的子组件的位置,尤其是子组件多的时刻。