亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue3源碼剖析之簡單實(shí)現(xiàn)方法

 更新時間:2021年09月07日 11:51:58   作者:ClyingDeng  
源碼的重要性相信不用再多說什么了吧,特別是用Vue 框架的,一般在面試的時候面試官多多少少都會考察源碼層面的內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于vue3源碼剖析之簡單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下

前言

最近,由于我的第一個vue3 + ts的正式項(xiàng)目,已經(jīng)進(jìn)入驗(yàn)收階段。聽你們老說vue3、vue3的,我就想著去看看vue3到底和vue2有啥區(qū)別。🤷🏻‍♀️🤷🏻‍♀️🤷🏻‍♀️

文章主要闡述vue3的API用法,以及簡單地實(shí)現(xiàn)一個vue3。帶大家感受一下vue3與之前vue2的區(qū)別。以及簡單帶大家揭秘源碼中vue3初始化的一個流程。

🍹準(zhǔn)備工作

要想看看vue3內(nèi)部的源碼是咋搞得,首先跟vue2源碼剖析一樣,先從github上下一份源碼到本地。

接著就是安裝依賴:

yarn --ignore-scripts

在你執(zhí)行命令的時候可能會遇到node版本過低的錯誤:

解決此問題可以升級自己的node版本,或者忽略該engine。

如果選擇忽略的話可以設(shè)置

yarn config set --ignore-engines true

然后執(zhí)行依賴安裝。

依賴安裝完成后,編譯打包生成vuejs文件:

yarn dev

需要調(diào)試的話,可以在packages\vue\examples文件下建立測試文件。引用打包后的vue文件,可以應(yīng)用packages\vue\dist\vue.global.js。

🍲vue3用法

vue3的特性我就不多闡述了,就vue3的用法而言,更傾向于函數(shù)式編程,通過對外暴露Vue中的createApp()API,以工廠函數(shù)的方式創(chuàng)建了一個應(yīng)用程序?qū)嵗O啾容^vue2的new Vue實(shí)例,更加貼切。

在源碼文件中,我們新建一個init.html文件。

<script src="../dist/vue.global.js"></script>
 <body>
  <div id="app">{{name}}</div>
  <script>
    const { createApp } = Vue
    const app1 = createApp({
      data() {
        return {
          name: 'clying'
        }
      },
      setup() {
        return {
          name: 'deng'
        }
      }
    }).mount('#app')
  </script>
</body>

根據(jù)上例,我們可以看出vue3是即支持Composition API,也支持Options API,兩者可以同時使用。

但是,我們可以看到在data和setup中,我同時使用了一個name變量進(jìn)行賦值。那么頁面中會展示哪一個呢?

3!2!1!上答案:

可以明顯看出composition-api中setup優(yōu)先級更高。

當(dāng)然也可以在源碼中的packages\runtime-core\src\componentPublicInstance.ts看到,通過switch先判斷setup中的變量是否存在,然后再去判斷data中的變量。所以setup中變量的優(yōu)先級會高于data中的變量。

🍖實(shí)現(xiàn)

通過上面的用法,我們可以知道vue3中會對外暴露一個Vue變量,內(nèi)部存在createApp、reactive等方法。

在此,我們先實(shí)現(xiàn)vue3的初始化框架。就createApp而言,它會接收用戶傳入的參數(shù):data()、setup()等,最后進(jìn)行實(shí)例掛載mount。所以在createApp中會接收一些參數(shù)options、內(nèi)部還會存在mount方法。

const Vue = {
    createApp(options) {
      return {
        mount(selector) { //解析、獲取render、掛載
        }
      }
    }
}

在mount中通過selector獲取到宿主元素。

接下來就是對模板的編譯,由于將template編譯AST后,依舊要轉(zhuǎn)成render函數(shù)。在此我們簡化操作,在編譯時直接返回一個render。

mount(selector) { //解析、獲取render、掛載
  const parent = document.querySelector(selector)
  console.log(parent);
  if (!options.render) {
    // 編譯返回render
    options.render = this.compileToFunction(parent.innerHTML)
  }
},
compileToFunction(template) {
  return function render() {
    const h = document.createElement('div')
    h.textContent = this.name
    return h
  }
}

拿到render之后,執(zhí)行它,將其添加到宿主元素中,將老的節(jié)點(diǎn)刪除。

在執(zhí)行render的時候,我們需要注意它的this指向。如果給它綁定data,那么它展示的就會使data中的name。

mount(selector) { //解析、獲取render、掛載
  const parent = document.querySelector(selector)
  console.log(parent);
  if (!options.render) {
    // 編譯返回render
    options.render = this.compileToFunction(parent.innerHTML)
  }
  // 執(zhí)行render 
  const el = options.render.call(options.data())
  parent.innerHTML = ''
  parent.appendChild(el)
},

可以看到頁面上展示的是clying。反之,如果綁定的是options.setup(),那么頁面上出現(xiàn)的就是deng。

對于vue3的用法,我們知道setup的優(yōu)先級是高于data的。那我們可以使用代理啊,將兩者的屬性變量,通過代理的方式,糅合到一起,優(yōu)先考慮setup。當(dāng)訪問相同name時,實(shí)際訪問的就是setup中的name。

mount(selector) { //解析、獲取render、掛載
  const parent = document.querySelector(selector)
  console.log(parent);
  if (!options.render) {
    // 編譯返回render
    options.render = this.compileToFunction(parent.innerHTML)
  }
  if (options.setup) {
    this.setupState = options.setup()
  }
  if (options.data) {
    this.data = options.data()
  }
  this.proxy = new Proxy(this, {
    get(target, key) {
      if (key in target.setupState) {
        return target.setupState[key]
      } else if (key in target.data) {
        return target.data[key]
      }// 還可能存在props、watch等其他同名變量
    }, 
    set(target, key, value, newVal) {
      console.log(target, key, value, newVal);
    }
  })
  // 執(zhí)行render  this.proxy就是整合setup和data的上下文
  const el = options.render.call(this.proxy)
  console.log(el, options.render);
  parent.innerHTML = ''
  parent.appendChild(el)
},

在proxy的get中,先看setup中是否存在目標(biāo)屬性,如果存在的話返回的就是setup中的屬性變量,否則就是data中的。在渲染的時候,直接將整合的變量集傳入即可。當(dāng)然proxy中也會存在set方法,需要先代理,然后在外部獲取變量做值得修改才能觸發(fā),在此有興趣的同學(xué)可以自行研究哦!

總結(jié)

到此這篇關(guān)于vue3源碼剖析之簡單實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)vue3源碼剖析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue+Element實(shí)現(xiàn)動態(tài)生成新表單并添加驗(yàn)證功能

    Vue+Element實(shí)現(xiàn)動態(tài)生成新表單并添加驗(yàn)證功能

    這篇文章主要介紹了Vue+Element實(shí)現(xiàn)動態(tài)生成新表單并添加驗(yàn)證功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Vue3使用indexDB緩存靜態(tài)資源的示例代碼

    Vue3使用indexDB緩存靜態(tài)資源的示例代碼

    IndexedDB 是一個瀏覽器內(nèi)建的數(shù)據(jù)庫,它可以存放對象格式的數(shù)據(jù),默認(rèn)情況下,瀏覽器會將自身所在的硬盤位置剩余容量全部作為indexedDB的存儲容量,本文給大家介紹了Vue3使用indexDB緩存靜態(tài)資源,需要的朋友可以參考下
    2024-10-10
  • Vite+Electron快速構(gòu)建VUE3桌面應(yīng)用的實(shí)現(xiàn)

    Vite+Electron快速構(gòu)建VUE3桌面應(yīng)用的實(shí)現(xiàn)

    本文主要介紹了Vite+Electron快速構(gòu)建VUE3桌面應(yīng)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 在Vue中實(shí)現(xiàn)網(wǎng)頁截圖與截屏功能詳解

    在Vue中實(shí)現(xiàn)網(wǎng)頁截圖與截屏功能詳解

    在Web開發(fā)中,有時候需要對網(wǎng)頁進(jìn)行截圖或截屏,Vue作為一個流行的JavaScript框架,提供了一些工具和庫,可以方便地實(shí)現(xiàn)網(wǎng)頁截圖和截屏功能,本文將介紹如何在Vue中進(jìn)行網(wǎng)頁截圖和截屏,需要的朋友可以參考下
    2023-06-06
  • Vue2.0生命周期的理解

    Vue2.0生命周期的理解

    這篇文章主要為大家介紹了Vue2.0生命周期,思考與理解“el被新創(chuàng)建的vm.$el替換”這句話,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 深入解析Vue的自定義指令

    深入解析Vue的自定義指令

    這篇文章主要介紹了深入解析Vue的自定義指令,自定義指令主要是為了重用涉及普通元素的底層 DOM 訪問的邏輯,一個自定義指令由一個包含類似組件生命周期鉤子的對象來定義,需要的朋友可以參考下
    2023-05-05
  • Vue開發(fā)實(shí)現(xiàn)吸頂效果的示例代碼

    Vue開發(fā)實(shí)現(xiàn)吸頂效果的示例代碼

    這篇文章主要介紹了Vue開發(fā)實(shí)現(xiàn)吸頂效果的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Nuxt3項(xiàng)目搭建過程(Nuxt3+element-plus+scss詳細(xì)步驟)

    Nuxt3項(xiàng)目搭建過程(Nuxt3+element-plus+scss詳細(xì)步驟)

    這篇文章主要介紹了Nuxt3項(xiàng)目搭建(Nuxt3+element-plus+scss詳細(xì)步驟),本次記錄一次使用Nuxt3搭建前端項(xiàng)目的過程,內(nèi)容包含Nuxt3的安裝,基于Vite腳手架(默認(rèn))構(gòu)建的vue3項(xiàng)目,element-plus的安裝配置,scss的安裝,目錄結(jié)構(gòu)的創(chuàng)建和解釋,需要的朋友可以參考下
    2022-12-12
  • VueCLI通過process.env配置環(huán)境變量的實(shí)現(xiàn)

    VueCLI通過process.env配置環(huán)境變量的實(shí)現(xiàn)

    本文主要介紹了VueCLI通過process.env配置環(huán)境變量的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Vue使用sign-canvas實(shí)現(xiàn)在線手寫簽名的實(shí)例

    Vue使用sign-canvas實(shí)現(xiàn)在線手寫簽名的實(shí)例

    sign-canvas?一個基于?canvas?開發(fā),封裝于?Vue?組件的通用手寫簽名板(電子簽名板),支持?pc?端和移動端,本文給大家分享Vue使用sign-canvas實(shí)現(xiàn)在線手寫簽名,感興趣的朋友一起看看吧
    2022-05-05

最新評論