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

vue虛擬DOM和render()函數(shù)詳解

 更新時(shí)間:2024年12月27日 08:38:58   作者:Mr Robot  
這篇文章主要講述了Vue.js中虛擬DOM和render()函數(shù)的使用方法,虛擬DOM是Vue.js的核心概念,它通過JavaScript對象來表示DOM樹,從而提高性能,render()函數(shù)比模板更接近編譯器,適用于需要JavaScript編程能力的場景,通過比較更新前后虛擬DOM結(jié)構(gòu)中的差異

vue虛擬DOM和render()函數(shù)

與其他的前端開發(fā)框架相比,Vue.js的優(yōu)勢是執(zhí)行性能比較高,這里有一個(gè)很重要的原因就是Vue.js采用虛擬DOM機(jī)制。

雖然大多數(shù)情況下,Vue.js推薦使用模板構(gòu)建HTML,但是在某些場景下,可能需要JavaScript的編程能力,這時(shí)就需要使用render()函數(shù),它比模板更接近編輯器。

通過本章內(nèi)容的學(xué)習(xí),讀者可以了解虛擬DOM和render()函數(shù)的使用方法。

虛擬DOM

DOM即文檔對象模型,它提供了對整個(gè)文檔的訪問模型,將文檔作為一個(gè)樹形結(jié)構(gòu),樹的每個(gè)結(jié)點(diǎn)表示了一個(gè)HTML標(biāo)簽或標(biāo)簽內(nèi)的文本項(xiàng)。

DOM樹結(jié)構(gòu)精確地描述了HTML文檔中標(biāo)簽間的相互關(guān)聯(lián)性。瀏覽器在解析HTML文檔時(shí),會將文檔中的元素、注釋、文本等標(biāo)記按照它們的層級關(guān)系轉(zhuǎn)化為DOM樹。

一個(gè)元素要想在頁面中顯示,則必須在DOM中存在該節(jié)點(diǎn),也就是必須將該元素節(jié)點(diǎn)添加到現(xiàn)有DOM樹中的某個(gè)節(jié)點(diǎn)下,才能渲染到頁面中。同樣地,如果需要刪除某個(gè)元素,也需要從DOM樹中刪除該元素對應(yīng)的節(jié)點(diǎn)。

如果每次要改變頁面展示的內(nèi)容,只能通過遍歷查詢DOM樹,然后修改DOM樹,從而達(dá)到更新頁面的目的,這個(gè)過程相當(dāng)消耗資源。

為了解決這個(gè)問題,虛擬DOM概念隨著React的誕生而誕生,其由Facebook提出,其卓越的性能很快得到廣大開發(fā)者的認(rèn)可。因?yàn)槊看尾樵僁OM幾乎都需要遍歷整個(gè)DOM樹,如果建立一個(gè)與DOM樹對應(yīng)的虛擬DOM對象,也就是JavaScript對象,以對象嵌套的方式來表示DOM樹及其層級結(jié)構(gòu),那么每次DOM的修改就變成了對JavaScript對象的屬性的操作,由于操作JavaScript對象比操作DOM要快得多,從而大幅度減少性能的開支。

Vue從2.0開始也在其核心引入了虛擬DOM的概念,Vue.js 3.x重寫了虛擬DOM的實(shí)現(xiàn),從而讓性能更加優(yōu)秀。

Vue在更新真實(shí)的DOM樹之前,先比較更新前后虛擬DOM結(jié)構(gòu)中有差異的部分,然后采用異步更新隊(duì)列的方式將差異部分更新到真實(shí)DOM中,從而減少了最終要在真實(shí)DOM上執(zhí)行的操作次數(shù),提高了頁面的渲染效率。

render()函數(shù)

大多數(shù)情況下,Vue通過template來創(chuàng)建HTML。但是在特殊情況下,可能需要JavaScript的編程能力,這時(shí)可以使用render()函數(shù),它比模板更接近編譯器。

下面通過一個(gè)簡單的例子,了解render()函數(shù)的優(yōu)勢。假設(shè)需要生成一些帶錨點(diǎn)的標(biāo)題,基礎(chǔ)代碼如下:

<h1>
   <a name="hello-world" href="#hello-world" rel="external nofollow"  rel="external nofollow" >
       Hello world!
   </a>
</h1>

由于錨點(diǎn)標(biāo)題的使用非常頻繁,考慮到標(biāo)題的級別包括h1~h6,可以將標(biāo)題的級別定義成組件的prop,在調(diào)用組件時(shí),可以通過該prop動態(tài)設(shè)置標(biāo)題元素的級別。

代碼如下:

<anchored-heading :level="1">Hello world!</anchored-heading>

接下來就是組件的實(shí)現(xiàn)代碼:

const app = createApp({})
app.component(‘a(chǎn)nchored-heading', {
template: `
props: { level: { type: Number, required: true } } })

上述通過模板的方式實(shí)現(xiàn)起來不僅冗長,而且為每個(gè)級別標(biāo)題都重復(fù)書寫了。

當(dāng)添加錨元素時(shí),還必須在每個(gè) v-if/v-else-if 分支中再次復(fù)制元素。

<div id="app">
        <anchored-heading :level="2">
            <a name="hello-world" href="#hello-world" rel="external nofollow"  rel="external nofollow" >
                相顧無相識,長歌懷采薇。
            </a>
        </anchored-heading>
    </div>
    <script src="https://unpkg.com/vue@next"></script>
    <script>
        const app = Vue.createApp({})
        app.component('anchored-heading', {
            render() {
                const { h } = Vue
                return h(
                  'h' + this.level, // 標(biāo)簽名
                  {}, // prop 或 attribute
                  this.$slots.default() // 包含其子節(jié)點(diǎn)的數(shù)組
                )
            },
             props: {
                level: {
                    type: Number,
                    required: true
                }
        })
        app.mount('#app')
    </script>

可見使用render()函數(shù)的實(shí)現(xiàn)要精簡得多。

需要注意的是:

向組件中傳遞不帶v-slot指令的子節(jié)點(diǎn)時(shí),比如 anchored-heading 中的 Hello world!,這些子節(jié)點(diǎn)被存儲在組件實(shí)例中的$slots.default中。在谷歌瀏覽器中運(yùn)行程序。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue項(xiàng)目打包部署到GitHub Pages的實(shí)現(xiàn)步驟

    Vue項(xiàng)目打包部署到GitHub Pages的實(shí)現(xiàn)步驟

    本文主要介紹了Vue項(xiàng)目打包部署到GitHub Pages的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Vue路由組件通過props配置傳參的實(shí)現(xiàn)

    Vue路由組件通過props配置傳參的實(shí)現(xiàn)

    本文主要介紹了Vue路由組件通過props配置傳參的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • vue跳轉(zhuǎn)外部鏈接的實(shí)現(xiàn)方法

    vue跳轉(zhuǎn)外部鏈接的實(shí)現(xiàn)方法

    這篇文章主要介紹了vue跳轉(zhuǎn)外部鏈接的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • vue進(jìn)行下載與處理二進(jìn)制流文件的方法詳解

    vue進(jìn)行下載與處理二進(jìn)制流文件的方法詳解

    這篇文章主要為大家詳細(xì)介紹了vue如何實(shí)現(xiàn)將后端返回的二進(jìn)制流進(jìn)行處理并實(shí)現(xiàn)下載,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Vue常用指令V-model用法

    Vue常用指令V-model用法

    本篇文章主要介紹了Vue常用指令_V-model用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Nuxt3項(xiàng)目中問題匯總之刷新頁面useFetch無返回解決

    Nuxt3項(xiàng)目中問題匯總之刷新頁面useFetch無返回解決

    Nuxt.js是一個(gè)基于 Vue.js 的服務(wù)端渲染應(yīng)用框架,這篇文章主要給大家介紹了關(guān)于Nuxt3項(xiàng)目中問題匯總之刷新頁面useFetch無返回解決辦法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 在vue中使用?jquery?的兩種方法小結(jié)

    在vue中使用?jquery?的兩種方法小結(jié)

    這篇文章主要介紹了在vue中使用?jquery?的兩種方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue?+?Print.js前端打印自定義字體大小、自定義樣式以及封裝共享樣式

    Vue?+?Print.js前端打印自定義字體大小、自定義樣式以及封裝共享樣式

    這篇文章主要介紹了Vue?+?Print.js前端打印自定義字體大小、自定義樣式以及封裝共享樣式的相關(guān)資料,Print.js主要是為了幫助我們直接在瀏覽器中開發(fā)打印功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • Vue?狀態(tài)存儲和會話存儲同步清空問題解決方案(最新推薦)

    Vue?狀態(tài)存儲和會話存儲同步清空問題解決方案(最新推薦)

    文章介紹了在使用Pinia定義的useHeaderTabStore中,tab狀態(tài)通過會話存儲初始化但未在退出登錄時(shí)同步清空的問題,通過在PiniaStore中定義清空tab的函數(shù),并在退出登錄時(shí)調(diào)用該函數(shù),可以確保狀態(tài)和會話存儲同步清空,避免內(nèi)存中殘留舊數(shù)據(jù),感興趣的朋友一起看看吧
    2024-12-12
  • Vue實(shí)現(xiàn)將頁面區(qū)域?qū)С鰹閜df

    Vue實(shí)現(xiàn)將頁面區(qū)域?qū)С鰹閜df

    文章介紹了兩種將前端頁面指定區(qū)域?qū)С鰹镻DF的純前端實(shí)現(xiàn)方法,方式一使用jsPDF和html2canvas將特定區(qū)域轉(zhuǎn)化為圖片,再將圖片轉(zhuǎn)化為PDF,適用于小區(qū)域轉(zhuǎn)換,但存在翻頁時(shí)內(nèi)容拆分的問題,方式二使用html2pdf.js,支持自動分頁,適用于較大區(qū)域的轉(zhuǎn)換
    2025-10-10

最新評論

门源| 吴江市| 五莲县| 喀喇沁旗| 瑞金市| 乡城县| 长海县| 武川县| 无极县| 开封县| 马龙县| 巧家县| 柘荣县| 精河县| 浙江省| 锡林浩特市| 丰台区| 德昌县| 双桥区| 滕州市| 永丰县| 镇安县| 兴海县| 栾城县| 潞城市| 昂仁县| 临朐县| 江源县| 福泉市| 二连浩特市| 章丘市| 和静县| 鄂托克前旗| 怀远县| 盐边县| 成武县| 搜索| 东台市| 泰顺县| 阿拉善左旗| 祁东县|