摘要:而我覺得現(xiàn)在出一個(gè)白話版,是讓大家有興趣去研究源碼的時(shí)候,可以提前理清一下思路。相當(dāng)于封裝,提取公共部分。顯然,今天我不是來(lái)教大家怎么用的,怎么用看文檔就好了,我是講解生命的真諦內(nèi)部的工作原理。而這個(gè)不會(huì)合并,直接替換掉整個(gè)選項(xiàng)
寫文章不容易,點(diǎn)個(gè)贊唄兄弟
專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧
研究基于 Vue版本 【2.5.17】
如果你覺得排版難看,請(qǐng)點(diǎn)擊 下面鏈接 或者 拉到 下面關(guān)注公眾號(hào)也可以吧
【Vue原理】Mixin - 白話版
今天我們用白話文解讀 mixin 的工作原理,輕松快速理解 mixin 內(nèi)部工作原理。你說(shuō),你只懂怎么用的,卻不懂他內(nèi)部是怎么工作的,這樣也不太行。
而我覺得現(xiàn)在出一個(gè) 白話版,是讓大家有興趣去研究源碼的時(shí)候,可以提前理清一下思路。暫時(shí)沒時(shí)間了解源碼的,也可以先了解下內(nèi)部流程,對(duì)解決一些奇奇怪怪的問題也是很有作用的
mixins 我覺得可能大家很少用把,但是這個(gè)東西真的非常有用。相當(dāng)于封裝,提取公共部分。
顯然,今天我不是來(lái)教大家怎么用的,怎么用看文檔就好了,我是講解 生命的真諦 內(nèi)部的工作原理。如果不懂用的,請(qǐng)去官網(wǎng)看怎么用,兄弟
mixin不難,就是有點(diǎn)繞,今天我們探索兩個(gè)問題
1、什么時(shí)候合并
2、怎么合并
什么是全局選項(xiàng)? 就是 全局組件,全局過(guò)濾器,全局指令,全局mixin
1、Vue.component 注冊(cè)的 【全局組件】
2、Vue.filter 注冊(cè)的 【全局過(guò)濾器】
3、Vue.directive 注冊(cè)的 【全局指令】
4、Vue.mixin 注冊(cè)的 【全局mixin】
也就是說(shuō),你全局注冊(cè)的選項(xiàng),其實(shí)會(huì)被傳遞引用到你的每個(gè)組件中,這樣,全局選項(xiàng) 和 組件選項(xiàng) 就會(huì)合并起來(lái),之后組件便能訪問到全局選項(xiàng),然后你就可以在組件內(nèi)使用全局注冊(cè)的選項(xiàng),比如使用 全局過(guò)濾器
其實(shí)就是像你在 自己的組件聲明 components 一樣,只是全局注冊(cè)的話,Vue 背后偷偷給你的每個(gè)組件 都合并多一個(gè)全局選項(xiàng)的引用
但是為了保證全局選項(xiàng)不被污染,又不可能每個(gè)組件都深度克隆一份全局選項(xiàng)導(dǎo)致開銷過(guò)大,所以會(huì)根據(jù)不同的選項(xiàng),做不同的處理。下面會(huì)詳細(xì)講解
1、組件選項(xiàng)
2、組件 - mixin
3、組件 - mixin - mixin
4、.....省略無(wú)數(shù)可能存在的嵌套 mixin
x、全局 選項(xiàng)
權(quán)重 從 1 到最后 依次減少
其實(shí)沒有權(quán)重這個(gè)東西,但是結(jié)果是一樣的,是我覺得這樣好理解,加上的一個(gè)概念
下面的講解,會(huì)使用 四種選項(xiàng)代號(hào) 作為例子
mixin 里面嵌套mixin 太深 很少見,而且也 難以維護(hù),所以就只嵌套一層為例
1、組件選項(xiàng):代號(hào)為 A
2、組件-mixin:代號(hào)為 B
3、組件-mixin-mixin :代號(hào)為 C
4、全局選項(xiàng) :代號(hào)為 D
包括選項(xiàng):data,provide
把兩個(gè)函數(shù)合并加到一個(gè)新函數(shù)中,并返回這個(gè)函數(shù)。在函數(shù)里面,會(huì)執(zhí)行 那兩個(gè)方法。
按照這個(gè)流程,使用代號(hào)
1、D 和 C 合并成一個(gè)函數(shù) (CD),函數(shù)執(zhí)行時(shí),會(huì)執(zhí)行 C ,再執(zhí)行 D
2、(CD) 和 B 合并成 一個(gè)函數(shù) (B(CD)),函數(shù)執(zhí)行時(shí),會(huì)執(zhí)行 B ,再執(zhí)行 (CD)
3、(B(CD)) 和 A 合并成一個(gè)函數(shù),函數(shù)執(zhí)行時(shí),會(huì)執(zhí)行 B ,再執(zhí)行 (B(CD))
有點(diǎn)繞,簡(jiǎn)化執(zhí)行流程是: A->B->C->D
data 中數(shù)據(jù)有重復(fù)的,權(quán)重大的優(yōu)先,比如下面
var test_mixins={ data(){ return {name:34} } } var a=new Vue({ mixins:[test_mixins], data(){ return {name:12} } })
可以看到,mixin 和 組件本身 的 data 都有 name 這個(gè)數(shù)據(jù),很顯然會(huì)以組件本身的為主,因?yàn)榻M件本身權(quán)重大
生命周期函數(shù)
權(quán)重越大的越放后面,會(huì)合并成一個(gè)數(shù)組,比如created
[ 全局 mixin - created, 組件 mixin-mixin - created, 組件 mixin - created, 組件 options - created ]
執(zhí)行流程是
生命周期,權(quán)重小的 先執(zhí)行
watch
合并成一個(gè)下面這樣的數(shù)組,權(quán)重越大的越放后面
[ 全局 mixin - watch, 組件 mixin-mixin - watch, 組件 mixin - watch, 組件 options - watch ]
執(zhí)行流程是
監(jiān)聽回調(diào),權(quán)重小的 先執(zhí)行
包括選項(xiàng):components,filters,directives
兩個(gè)對(duì)象合并的時(shí)候,不會(huì)相互覆蓋,而是 權(quán)重小的 被放到 權(quán)重大 的 的原型上
這樣權(quán)重大的,訪問快些,因?yàn)樽饔糜蜴湺塘?/p>
A.__proto__ = B B.__proto__ = C C.__proto__ = D
兩個(gè)對(duì)象合并的時(shí)候,不會(huì)
以 filter 為例,下面是四種 filter 合并
// 全局 filter Vue.filter("global_filter",function (params) {}) // mixin 的 mixin var mixin_mixin={ filters:{ mixin_mixin_filter(){} } } // mixin filter var test_mixins={ filters:{ mixin_filter(){} } } // 組件 filter var a=new Vue({ mixins:[test_mixins], filters:{ self_filter(){} } })
結(jié)果就系這樣..
包括選項(xiàng):props,methods,computed,inject
兩個(gè)對(duì)象合并,如果有重復(fù)key,權(quán)重大的覆蓋權(quán)重小的
比如
組件的 props:{ name:""}
組件mixin 的 props:{ name:"", age: "" }
那么 把兩個(gè)對(duì)象合并,有相同屬性,以 權(quán)重大的為主,組件的 name 會(huì)替換 mixin 的name
這是默認(rèn)的處理方式,當(dāng)選項(xiàng)不屬于上面的處理方式的時(shí)候,就會(huì)像這樣處理,包含選項(xiàng):el,template,propData 等
兩個(gè)數(shù)據(jù)只替換,不合并,權(quán)重大的,會(huì)一直替換 權(quán)重小的,因?yàn)檫@些屬于只允許存在一個(gè),所有只使用權(quán)重大的選項(xiàng)
組件 設(shè)置 template,mixin 也設(shè)置 template,不用怕,組件的肯定優(yōu)先
這個(gè)好像跟 覆蓋疊加 很像,其實(shí)不一樣,覆蓋疊加會(huì)把兩個(gè)數(shù)據(jù)合并,重復(fù)的才覆蓋。而這個(gè)不會(huì)合并,直接替換掉整個(gè)選項(xiàng)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105197.html
寫文章不容易,點(diǎn)個(gè)贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 Vue版本 【2.5.17】 如果你覺得排版難看,請(qǐng)點(diǎn)擊 下面鏈接 或者 拉到 下面關(guān)注公眾號(hào)也可以吧 【Vue原理】Mixins - 源碼版 今天探索的是 mixins 的源碼,mixins 根據(jù)不同的選項(xiàng)類型會(huì)做不同的處理 篇幅會(huì)有些長(zhǎng),...
摘要:所以我今后打算把每一個(gè)內(nèi)容分成白話版和源碼版。有什么錯(cuò)誤的地方,感謝大家能夠指出響應(yīng)式系統(tǒng)我們都知道,只要在實(shí)例中聲明過(guò)的數(shù)據(jù),那么這個(gè)數(shù)據(jù)就是響應(yīng)式的。什么是響應(yīng)式,也即是說(shuō),數(shù)據(jù)發(fā)生改變的時(shí)候,視圖會(huì)重新渲染,匹配更新為最新的值。 寫文章不容易,點(diǎn)個(gè)贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 V...
摘要:如果沒有緩存,我們將不可避免的多次執(zhí)行的現(xiàn)在我們要開始講解,是如何判斷是否使用緩存的首先計(jì)算后,會(huì)把計(jì)算得到的值保存到一個(gè)變量中。當(dāng)使用緩存時(shí),就直接返回這個(gè)變量。 寫文章不容易,點(diǎn)個(gè)贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 Vue版本 【2.5.17】 如果你覺得排版難看,請(qǐng)點(diǎn)擊 下面鏈接 或...
摘要:通常會(huì)做很多判斷來(lái)選擇存在的類型,比如判斷等是否存在,而選擇他為微任務(wù)類型但是可能宏微任務(wù)最后都是,因?yàn)樗潜J丶嫒萏幚怼? 寫文章不容易,點(diǎn)個(gè)贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 Vue版本 【2.5.17】 如果你覺得排版難看,請(qǐng)點(diǎn)擊 下面鏈接 或者 拉到 下面關(guān)注公眾號(hào)也可以吧 【V...
摘要:寫文章不容易,點(diǎn)個(gè)贊唄兄弟專注源碼分享,文章分為白話版和源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺得排版難看,請(qǐng)點(diǎn)擊下面鏈接或者拉到下面關(guān)注公眾號(hào)也可以吧原理白話版事件是我最感興趣的東西之 寫文章不容易,點(diǎn)個(gè)贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于...
閱讀 1056·2023-04-25 17:51
閱讀 2863·2021-11-23 09:51
閱讀 1485·2021-11-08 13:21
閱讀 2459·2021-09-22 15:14
閱讀 1526·2019-08-30 12:48
閱讀 1088·2019-08-29 12:44
閱讀 1146·2019-08-26 12:21
閱讀 1403·2019-08-26 10:47