几种罕见的Vue组件间的传参体式格局

几种罕见的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实例,所以轻易涌现反复触发的情形,比方:

      1. 多人开辟时,A、B两个人定义了统一个事宜名。
      2. 两个页面都定义了统一个事宜名,而且没有用$off烧毁(常涌现在路由切换时)。
      3. 在for出来的组件里注册。
    • 项目一大用这类体式格局治理事宜会非常杂沓,这时刻发起用vuex。

3.props和\$emit/\$on

引见

最基本的父组件给子组件通报数据体式格局,将我们自定义的属性传给子组件,子组件经由过程$emit要领,触发父组件v-on的事宜,从而完成子组件触发父组件要领

运用要领

props运用传送门

\$emit/\$on运用传送门

优瑕玷

  • 长处

    • 运用最为简朴,也是父子组件通报最罕见的要领。
    • Vue为给props供应了范例搜检支撑。
    • $emit不会修改到别的组件的同名事宜,由于他只能触发父级的事宜,这里和event-bus差别
  • 瑕玷

    • 单一组件层级一深须要逐层通报,会有许多不必要的代码量。
    • 不能处理了多组件依靠统统一状况的题目。

Tips

\$attrs/\$listeners能够将父组件的props和事宜监听器继续给子元素,在子组件能够挪用到父组件的事宜和props

$attrs运用传送门

$listeners运用传送门

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拿到的是一个数组,你并不能很正确的找到你要找的子组件的位置,尤其是子组件多的时刻。
    原文作者:魏晨欧尼酱
    原文地址: https://segmentfault.com/a/1190000017357320
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞