<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
createApp({}).mount(‘#app')
類似於 vue2.x 的Watcher, computed,watch,渲染過程中componentUpdateFn也使用了 ReactiveEffect,
const effect = new ReactiveEffect(fn,…)後,除了計算屬性會在被存取時才去呼叫effect.run()->呼叫fn(),在fn裡存取響應式變數,收集依賴,其餘的setupRenderEffect,watch,watchEffect,均會在建立ReactiveEffect後呼叫effect.run()收集依賴,其中
setupRenderEffect
會存取依賴的響應變數watch(source,cb,options)
,會執行存取source的函數,收集依賴watchEffect(fn)
,會自動執行一次fn收集依賴effect(fn,options)
,其中options有個lazy:true選項,表示不立即執行fn函數收集依賴,返回一個run函數,再次呼叫run(),執行一次fn函數,收集依賴// 1.計算屬性 // computed.ts // ComputedRefImpl類建構函式呼叫了new ReactiveEffect this.effect = new ReactiveEffect(getter, () => { if (!this._dirty) { this._dirty = true triggerRefValue(this) } }) // 2. effect // effect.ts // effect函數中,可以接收第二個引數effect(fn,{lazy:true}),表示不立即執行 const _effect = new ReactiveEffect(fn) // 3. apiWatch.ts doWatch方法 // watch和watchEffect都是通過doWatch函數來,在這裡呼叫new ReactiveEffect,然後根據不同情況執行effect.run(),對於watchEffect就是//執行器回撥,對於watch就是存取監聽的資料,然後收集依賴 const effect = new ReactiveEffect(getter, scheduler) // 4. render.ts //在 setupRenderEffect中 const effect = (instance.effect = new ReactiveEffect( componentUpdateFn,//更新元件函數 () => queueJob(update), instance.scope // track it in component's effect scope ))
在vue3中,程式的初始化不再沿用vue2的new Vue()方法,而是使用了createApp。在createApp中發生了什麼呢?
createApp是一個Vue中的工廠函數,以函數的方式進行匯入和呼叫。而函數式的好處是
1、消滅了原來掛載在Vue上的靜態方法,變成實體方法,可以減少記憶體佔用,便於tree-shaking,減小了打包體積;
2、因為函數式和class裝飾器對ts的支援好,使用函數的方式呼叫,可以更好的支援ts,提高型別支援
3、根元件的api,如data要和子元件的api保持相同的格式,掛載從$mount改為mount,簡化了api並統一了api的一致性
4、new Vue中掛載的方法會造成全域性汙染,不能獨立出來,createApp可以相互獨立,並按需掛載。
mount
const Vue = { createApp(options) { //返回app範例 return { mount(selector){ // 獲取渲染函數,編譯結果 // 渲染dom,追加到宿主元素 } compile(template){ //返回render return function render(){ //描述檢視 } } } } }
在呼叫createApp時,如果options中無render,則初始化元件,呼叫compile產生一個render,若有render則直接掛載;
Vue2中追加元素使用比較替換的方式,diff元素間區別進行對比判斷,Vue3中則是直接進行刪除重加。
可以在setup或者是data中定義響應式變數, setup的優先順序更高。
createApp
Vue暴露的兩個初始化的函數,createApp和createRenderer,他們之間的呼叫關係
/*暴露給Vue的createApp*/ function createApp(options){ const renderer = Vue.createRenderer({ /*定義一些平臺特有的api,一些範例*/ aaa(){}, bbb(){} }) /*使用者呼叫的createApp,實際上是渲染器的createApp*/ return renderer.createApp() } function createRenderer({aaa,bbb}){ /*獲得渲染器*/ /*這個createApp是函數內部的*/ return createApp(options){ /*掛載邏輯*/ return { /*返回App範例*/ } } }
1、使用者呼叫createApp方法 =》 通過ensureRenderer得到渲染器
2、渲染器呼叫createRender =》※呼叫工廠函數baseGreateRenderer,這個函數中定義了patch和diff等,最終會return一個render用來給spa頁面進行渲染,一個hydrate用來給ssr頁面進行注水,還有一個函數的createApp(不同於Vue的createApp)
3、在函數的createApp中會定義程式的實體方法,如mount,get,set,use,mixin等
4、mount實體方法會去檢視是否有根元件掛載,使用什麼方法進行掛載(spa/ssr)
5、render方法呼叫patch方法進行打修補程式
6、patch方法根據傳入的節點型別進行掛載方法的判斷,如果首次掛載則為掛載component,之後是掛載element(patch方法會將vnode轉化為node節點)
7、patch方法執行內部processComponent方法,最終執行mountComponent方法,也就是Vue2中$mount最終執行的方法
1、根元件的範例化:呼叫createComponentInstance
2、初始化根元件:呼叫setupComponent方法,也就是Vue2中的this.$_init方法,用來將選項進行合併,並設定勾點和響應式
3、安裝render函數的副作用函數:setupRendererEffect
在Vue3中取消了watcher改為了副作用函數,副作用函數會在每次響應式資料發生變化的時候重新執行,內部的render函數的執行會觸發依賴收集,這樣當響應式資料變化時,響應式元件就會更新。
PS:與react中的useEffect不同的方面是,useEffect需要手動的收集依賴,而Vue中的effect()會自動的收集依賴。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45