搜尋
首頁web前端Vue.jsVue3初始化怎麼呼叫函數

Vue3初始化怎麼呼叫函數

May 21, 2023 pm 12:55 PM
vue3

Vue3初始化呼叫函數

createApp({}).mount(‘#app')

入口檔runtime-dom/src/index.tx

  • createApp -> createRenderer -> createBaseRenderer(這裡也創建了render函數以及一系列渲染時的函數) -> createAppAPI(返回了真正的createApp方法),返回了實例app,

  • 然後app.mount(“#app” ) -> createVNode -> render(vnode,rootcontainier,isSVG) -> patch -> processComponent -> mountComponent(初次渲染)或是updateComponent ->

  • #對於setupComponent,有setup函數和沒有setup函數分情況處理,如果有就走setup函數處理,初始化props等需要傳遞給setup函數的參數,調用setup,setupComponent->finishComponentSetup(在這裡會處理2.x版本的options選項初始化),
  • 對於setupRenderEffect,執行一系列生命鉤子函數,創建渲染ReactiveEffect,並執行了**effect.run()* *方法
  • ReactiveEffect

類似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程式初始化流程

初始化

Vue 3 不再使用Vue2 的new Vue() 方法進行程式初始化,而是採用了createApp 方法。在createApp中發生了什麼事?

改寫的原因

createApp是一個Vue中的工廠函數,以函數的方式進行導入和呼叫。而函數式的好處是

1、消滅了原先掛載在Vue上的靜態方法,變成實例方法,可以減少記憶體佔用,便於tree-shaking,減少了打包體積;

函數式和類別裝飾器在TypeScript 的支援性很好,使用函數呼叫的方式可以更好地支援TypeScript,從而提高類型支援

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()會自動的收集依賴。 

以上是Vue3初始化怎麼呼叫函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
前端景觀:Netflix如何處理其選擇前端景觀:Netflix如何處理其選擇Apr 15, 2025 am 12:13 AM

Netflix在前端技術上的選擇主要集中在性能優化、可擴展性和用戶體驗三個方面。 1.性能優化:Netflix選擇React作為主要框架,並開發了SpeedCurve和Boomerang等工具來監控和優化用戶體驗。 2.可擴展性:他們採用微前端架構,將應用拆分為獨立模塊,提高開發效率和系統擴展性。 3.用戶體驗:Netflix使用Material-UI組件庫,通過A/B測試和用戶反饋不斷優化界面,確保一致性和美觀性。

React與Vue:Netflix使用哪個框架?React與Vue:Netflix使用哪個框架?Apr 14, 2025 am 12:19 AM

NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVuedIrectly.1)TeamSperience:selectBasedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects:reactforforforproproject,reactforforforcompleplexones.3)cocatizationneedneeds:reactoffipicatizationneedneedneedneedneedneeds:reactoffersizationneedneedneedneedneeds:reactoffersizatization needefersmoreflexibleise.4)

框架的選擇:是什麼推動了Netflix的決定?框架的選擇:是什麼推動了Netflix的決定?Apr 13, 2025 am 12:05 AM

Netflix在框架選擇上主要考慮性能、可擴展性、開發效率、生態系統、技術債務和維護成本。 1.性能與可擴展性:選擇Java和SpringBoot以高效處理海量數據和高並發請求。 2.開發效率與生態系統:使用React提升前端開發效率,利用其豐富的生態系統。 3.技術債務與維護成本:選擇Node.js構建微服務,降低維護成本和技術債務。

反應,vue和Netflix前端的未來反應,vue和Netflix前端的未來Apr 12, 2025 am 12:12 AM

Netflix主要使用React作為前端框架,輔以Vue用於特定功能。 1)React的組件化和虛擬DOM提升了Netflix應用的性能和開發效率。 2)Vue在Netflix的內部工具和小型項目中應用,其靈活性和易用性是關鍵。

前端中的vue.js:現實世界的應用程序和示例前端中的vue.js:現實世界的應用程序和示例Apr 11, 2025 am 12:12 AM

Vue.js是一種漸進式JavaScript框架,適用於構建複雜的用戶界面。 1)其核心概念包括響應式數據、組件化和虛擬DOM。 2)實際應用中,可以通過構建Todo應用和集成VueRouter來展示其功能。 3)調試時,建議使用VueDevtools和console.log。 4)性能優化可通過v-if/v-show、列表渲染優化和異步加載組件等實現。

vue.js和React:了解關鍵差異vue.js和React:了解關鍵差異Apr 10, 2025 am 09:26 AM

Vue.js適合小型到中型項目,而React更適用於大型、複雜應用。 1.Vue.js的響應式系統通過依賴追踪自動更新DOM,易於管理數據變化。 2.React採用單向數據流,數據從父組件流向子組件,提供明確的數據流向和易於調試的結構。

vue.js vs.反應:特定於項目的考慮因素vue.js vs.反應:特定於項目的考慮因素Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

vue怎麼a標籤跳轉vue怎麼a標籤跳轉Apr 08, 2025 am 09:24 AM

實現 Vue 中 a 標籤跳轉的方法包括:HTML 模板中使用 a 標籤指定 href 屬性。使用 Vue 路由的 router-link 組件。使用 JavaScript 的 this.$router.push() 方法。可通過 query 參數傳遞參數,並在 router 選項中配置路由以進行動態跳轉。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。