九九热线视频精品99-动漫高h纯肉无码视频在线观看-午夜理论无码片在线观看免费-99精品国产在热久久无码-亚洲国产成人乱码

Vue組件通信方式居然有這么多?你了解幾種

2020/10/28 10:24:47   閱讀:2954    發布者:2954

1. props/$emit

props和$emit相信大家十分的熟悉了,這是我們最常用的vue通信方式。
props
props可以是數組或對象,用于接收來自父組件通過v-bind傳遞的數據。當props為數組時,直接接收父組件傳遞的屬性;當 props 為對象時,可以通過typedefaultrequired、validator等配置來設置屬性的類型、默認值、是否必傳和校驗規則。
$emit
在父子組件通信時,我們通常會使用$emit來觸發父組件v-on在子組件上綁定相應事件的監聽。

2. v-slot

v-slot是 Vue2.6 版本中新增的用于統一實現插槽和具名插槽的api,用于替代slot(2.6.0廢棄)、slot-scope(2.6.0廢棄)scope(2.5.0廢棄)api
v-slot
template 標簽中用于提供具名插槽或需要接收 prop 的插槽,如果不指定 v-slot ,則取默認值 default

3. $refs/$parent/$children/$root

我們也同樣可以通過 $refs/$parent/$children/$root 等方式獲取 Vue 組件實例,得到實例上綁定的屬性及方法等,來實現組件之間的通信。
$refs
我們通常會將 $refs 綁定在DOM元素上,來獲取DOM元素的 attributes。在實現組件通信上,我們也可以將 $refs 綁定在子組件上,從而獲取子組件實例。
$parent
我們可以在 Vue 中直接通過this.$parent來獲取當前組件的父組件實例(如果有的話)。
$children
同理,我們也可以在 Vue 中直接通過this.$children來獲取當前組件的子組件實例的數組。但是需要注意的是,this.$children數組中的元素下標并不一定對用父組件引用的子組件的順序,例如有異步加載的子組件,可能影響其在 children 數組中的順序。所以使用時需要根據一定的條件例如子組件的name去找到相應的子組件。
$root
獲取當前組件樹的根 Vue 實例。如果當前實例沒有父實例,此實例將會是其自己。通過 $root ,我們可以實現組件之間的跨級通信。

4. $attrs/$listener

$attrs 和 $listeners 都是 Vue2.4 中新增加的屬性,主要是用來供使用者用來開發高級組件的。

$attrs
用來接收父作用域中不作為 prop 被識別的 attribute 屬性,并且可以通過v-bind="$attrs"傳入內部組件——在創建高級別的組件時非常有用。
試想一下,當你創建了一個組件,你要接收 param1 param2、param3 …… 等數十個參數,如果通過 props,那你需要通過props: ['param1', 'param2', 'param3', ……]等聲明一大堆。如果這些 props 還有一些需要往更深層次的子組件傳遞,那將會更加麻煩。
而使用 $attrs ,你不需要任何聲明,直接通過$attrs.param1、$attrs.param2……就可以使用,而且向深層子組件傳遞上面也給了示例,十分方便。

$listeners
包含了父作用域中的 v-on 事件監聽器。它可以通過 v-on="$listeners" 傳入內部組件——在創建更高層次的組件時非常有用,這里

5. provide/inject

provide/inject這對選項需要一起使用,以允許一個祖先組件向其所有子孫后代注入一個依賴,不論組件層次有多深,并在其上下游關系成立的時間里始終生效。如果你是熟悉React的同學,你一定會立刻想到Context這個api,二者是十分相似的。
provide
是一個對象,或者是一個返回對象的函數。該對象包含可注入其子孫的 property ,即要傳遞給子孫的屬性和屬性值。
injcet
一個字符串數組,或者是一個對象。當其為字符串數組時,使用方式和props十分相似,只不過接收的屬性由data變成了provide中的屬性。當其為對象時,也和props類似,可以通過配置defaultfrom等屬性來設置默認值,在子組件中使用新的命名屬性等。

6. eventBus

eventBus又稱事件總線,通過注冊一個新的Vue實例,通過調用這個實例的$emit$on等來監聽和觸發這個實例的事件,通過傳入參數從而實現組件的全局通信。它是一個不具備 DOM 的組件,有的僅僅只是它實例方法而已,因此非常的輕便。
我們可以通過在全局Vue實例上注冊:

// main.js

Vue.prototype.$Bus = new Vue()

但是當項目過大時,我們最好將事件總線抽象為單個文件,將其導入到需要使用的每個組件文件中。這樣,它不會污染全局命名空間:

// bus.js,使用時通過import引入

import Vue from 'vue'

export const Bus = new Vue()

7. Vuex

當項目龐大以后,在多人維護同一個項目時,如果使用事件總線進行全局通信,容易讓全局的變量的變化難以預測。于是有了Vuex的誕生。
Vuex
是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化。
有關Vuex的內容,可以參考Vuex官方文檔,我就不在這里班門弄斧了,直接看代碼。


主站蜘蛛池模板: 色妞www精品视频二| 免费人成网站在线观看不| 7777亚洲大胆裸体艺术全集| 亚洲一区二区三区播放| 丰满少妇女裸体bbw| 亚洲中文字幕无码天堂男人| 麻豆视传媒精品av| 涩欲国产一区二区三区四区| 国产成人午夜福利在线小电影| 亚洲中文字幕无码久久| 亚洲美女国产精品久久久久久久久| 精品少妇高潮 蜜臀| 免费人成视频在线播放| 天天爽天天摸天天碰| 免费专区丝袜调教视频| 精品久久久久久久无码| 伊人久久大香线蕉av网禁呦| 国产999精品成人网站| 成人看片黄a免费看在线| 国产传媒麻豆剧精品av国产| 成品人视频ww入口| 国内揄拍国产精品人妻门事件| 国产一区二区三区日韩精品| 宅女午夜福利免费视频| 久久精品一本到东京热| 国产老师开裆丝袜喷水视频| 国产 | 久你欧洲野花视频欧洲1| 色综合视频一区二区三区| 国产极品美女到高潮| 国产特黄级aaaaa片免| 精品国精品自拍自在线| 国产鲁鲁视频在线观看| 香蕉蕉亚亚洲aav综合| 国产麻传媒精品国产av| 国产成人精品热玖玖玖| 亚洲日本乱码一区二区产线一∨| 午夜精品一区二区三区在线观看| 亚洲国产精品无码aaa片| 久久久久免费看黄a片app| 亚洲精品成人片在线观看精品字幕| 香港三级午夜理论三级|