最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript 虛擬 DOM詳解

 更新時間:2021年12月09日 14:33:04   作者:ZhangLiangXWZ  
這篇文章主要為大家介紹了Javascript 虛擬 DOM,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

什么是虛擬 dom?

虛擬 dom 本質上就是一個普通的JS對象(mounted 中打印 this. _vnode 就是該對象內容),用于描述視圖的界面結構

在vue中,每個組件都有一個render函數,每個render函數都會返回一個虛擬dom樹,這也就意味著每個組件都對應一棵虛擬DOM樹

在這里插入圖片描述

vnode 是一個普通的 JS 對象,用于描述界面上應該有什么,比如:

var vnode = {
  tag: "h1",
  children: [
    { tag: undefined, text: "第一個vue應用:Hello World"}
  ]
}

上面的對象描述了:

有一個標簽名為 h1 的節(jié)點,它有一個子節(jié)點,該子節(jié)點是一個文本,內容為「第一個vue應用:Hello World」

為什么需要虛擬dom?

在vue中,渲染視圖會調用render函數,這種渲染不僅發(fā)生在組件創(chuàng)建時,同時發(fā)生在視圖依賴的數據更新時。如果在渲染時,直接使用真實DOM,由于真實DOM的創(chuàng)建、更新、插入等操作會帶來大量的性能損耗,從而就會極大的降低渲染效率。

因此,vue在渲染時,使用虛擬dom來替代真實dom,主要為解決渲染效率的問題。

對比創(chuàng)建js對象和真實 dom 對象效率:

在這里插入圖片描述

結果:

在這里插入圖片描述

創(chuàng)建一個真實的 dom 會伴隨著創(chuàng)建許多的屬性

在這里插入圖片描述

虛擬dom是如何轉換為真實dom的?

在一個組件實例首次被渲染時,它先生成虛擬dom樹,然后根據虛擬dom樹創(chuàng)建真實dom,并把真實dom掛載到頁面中合適的位置,此時,每個虛擬dom便會對應一個真實的dom。如果頁面只會刷新一次,后續(xù)不會有數據更新等問題的情況下,用虛擬 dom 的方式是比直接顯示真實 dom 效率低的。

如果一個組件受響應式數據變化的影響,需要重新渲染時,它仍然會重新調用render函數,創(chuàng)建出一個新的虛擬dom樹,用新樹和舊樹對比,通過對比,找出差異,然后僅更新差異部分的虛擬dom節(jié)點,最后,這些更新過的虛擬節(jié)點,會去修改它們對應的真實dom

這樣一來,就保證了對真實dom達到最小的改動。

在這里插入圖片描述

模板和虛擬dom的關系

vue框架中有一個compile(編譯)模塊,它主要負責將模板轉換為render函數,而render函數調用后將得到虛擬dom。

編譯的過程分兩步:

1.將模板字符串轉換成為AST(抽象語法樹:用js樹形結構來描述我們原始的代碼;在線工具:https://astexplorer.net/

2.將AST轉換為render函數

vue 模板并不是真實的 DOM,它會被編譯為虛擬 DOM

<div id="app">
  <h1>第一個vue應用:{{title}}</h1>
  <p>作者:{{author}}</p>
</div>

上面的模板會被編譯為類似下面結構的虛擬 DOM

{
  tag: "div",
  children: [
    { tag: "h1", children: [ { text: "第一個vue應用:Hello World" } ] },
    { tag: "p", children: [ { text: "作者:袁" } ] }
  ]
}

如果使用傳統的引入方式(script src="...vue.js"),則編譯時間發(fā)生在組件第一次加載時,這稱之為運行時編譯。

如果是在vue-cli的默認配置下,編譯發(fā)生在打包時(npm run build),打包之后就沒有模板只有 render 函數了,這稱之為模板預編譯。

編譯是一個極其耗費性能的操作,預編譯可以有效的提高運行時的性能,而且,由于運行的時候已不需要編譯,vue-cli在打包時會排除掉vue中的compile模塊,以減少打包體積

打包時是否需要包含?compile?模塊,是通過?vue.config.js?中的?runtimeCompiler: true?來控制的,默認 false,不包含。不建議更改該配置

模板的存在,僅僅是為了讓開發(fā)人員更加方便的書寫界面代碼

vue最終運行的時候,最終需要的是render函數,而不是模板,因此,模板中的各種語法,在虛擬dom中都是不存在的,它們都會變成虛擬dom的配置

在?vue-cli?中如果同時存在?template?和?render, 由于存在一個打包過程,其中的模板預編譯會生成?render?覆蓋原有的?render?函數

在 vue 中如果同時存在?template?和?render,一定是以?render?為準

虛擬 DOM 樹會最終生成為真實的 DOM 樹

在這里插入圖片描述

vue通過以下邏輯生成vnode tree:

在這里插入圖片描述

注意:虛擬節(jié)點樹必須是單根的

注入

在這里插入圖片描述

vue會將以下配置注入到vue實例:

  • data:和界面相關的數據
  • computed:通過已有數據計算得來的數據,將來詳細講解
  • methods:方法

模板中可以使用vue實例中的成員

為了防止名稱沖突。因為會將data中數據代理給vue,假如說我們自己寫的data名稱和vue中自帶的屬性沖突了,那么就會覆蓋vue內部的屬性,所以vue會把自己內部的屬性成員名稱前加上 或 , 如 果 加 上 的 是 或_,如果加上的是 或,?如果加上的是,代表是我們可以使用的,如果加上的是_,是vue自己內部使用的方法或屬性,我們不需要調用

掛載

將生成的真實 DOM 樹,放置到某個元素位置,稱之為掛載

掛載的方式:

1.通過el:"css選擇器"進行配置

2.通過vue實例.$mount(“css選擇器”)進行配置

完整流程

  • 實例被創(chuàng)建: new Vue()
  • 注入完成之后才會有響應式,能監(jiān)聽到數據變化
  • 編譯生成虛擬 DOM 樹:首先找 render 函數,沒有就找模板把它生成 render,最后運行 render,生成虛擬 DOM 樹
  • 掛載完成:頁面上顯示

在這里插入圖片描述

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • 學習JavaScript編程語言的8張思維導圖分享

    學習JavaScript編程語言的8張思維導圖分享

    這篇文章主要介紹了學習JavaScript編程語言的8張思維導圖分享,本文給出了javascript變量、javascript運算符、javascript數組、javascript流程語句、javascript字符串函數、javascript函數基礎、javascript基礎DOM操作、javascript正則表達式的思維導圖,需要的可以參考下
    2015-03-03
  • 微信小程序實現日期范圍選擇

    微信小程序實現日期范圍選擇

    這篇文章主要為大家詳細介紹了微信小程序實現日期范圍選擇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • three.js設置物體的縮放和旋轉代碼示例

    three.js設置物體的縮放和旋轉代碼示例

    最近在用three.js做三維模型的時候,需要通過鼠標滑輪向前來控制視角朝鼠標的位置放大,然后通過鼠標滑輪向后將視角復原,這篇文章主要給大家介紹了關于three.js如何設置物體的縮放和旋轉的相關資料,需要的朋友可以參考下
    2023-11-11
  • 如何使用JS獲取世界不同時區(qū)的當前時間

    如何使用JS獲取世界不同時區(qū)的當前時間

    文章介紹了在前端開發(fā)中使用JavaScript獲取不同時區(qū)當前時間的幾種方法,文章還提醒開發(fā)者要注意國際化和本地化最佳實踐,并進行充分的測試以確保代碼在不同環(huán)境和時區(qū)中的正確性,感興趣的朋友一起看看吧
    2024-12-12
  • JavaScript空數組的every()方法實踐

    JavaScript空數組的every()方法實踐

    every()方法用于檢測數組中的所有元素是否都滿足指定條件, 本文主要介紹了JavaScript空數組的every()方法實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • javascript中動態(tài)函數用法實例分析

    javascript中動態(tài)函數用法實例分析

    這篇文章主要介紹了javascript中動態(tài)函數用法,實例分析了動態(tài)函數的定義方法與使用技巧,需要的朋友可以參考下
    2015-05-05
  • js實現AI五子棋人機大戰(zhàn)

    js實現AI五子棋人機大戰(zhàn)

    這篇文章主要為大家詳細介紹了js實現AI五子棋人機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • javascript中延遲加載的7種方法實現

    javascript中延遲加載的7種方法實現

    在web前端開發(fā)中,性能優(yōu)化一直是一個非常重要的話題,JavaScript中延遲加載的方式有很多種,本文就來介紹了javascript中延遲加載的7種方法實現,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • JavaScript的內存釋放問題詳解

    JavaScript的內存釋放問題詳解

    這篇文章主要介紹了JavaScript的內存釋放問題詳解的相關資料,需要的朋友可以參考下
    2015-01-01
  • 分享一個原生的JavaScript拖動方法

    分享一個原生的JavaScript拖動方法

    本文給大家分享的是基于JavaScript的setCapture方法實現的拖動效果,非常的簡單實用,有需要的小伙伴可以參考下
    2016-09-09

最新評論

安顺市| 会同县| 壤塘县| 南部县| 衡水市| 玉田县| 敦煌市| 巨野县| 武威市| 卓尼县| 蓬安县| 光山县| 衡阳县| 宾阳县| 镇平县| 新蔡县| 涿鹿县| 彰化县| 三江| 鸡泽县| 凤庆县| 章丘市| 政和县| 马公市| 大荔县| 鄂伦春自治旗| 衡阳市| 固阳县| 沙洋县| 余干县| 宜昌市| 普兰县| 威信县| 商河县| 金阳县| 龙山县| 剑阁县| 奉新县| 鄂伦春自治旗| 和平县| 临夏市|