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

vue中的h函數(shù)使用及說明

 更新時(shí)間:2025年12月13日 14:35:57   作者:@紅@旗下的小兵  
這篇文章主要介紹了Vue中h函數(shù)的使用和虛擬DOM的概念,h函數(shù)是Vue中的createElement方法,用于創(chuàng)建虛擬DOM,虛擬DOM是一個(gè)普通的JavaScript對象,包含tag,props,children三個(gè)屬性,通過diff算法,可以追蹤DOM的變化,只對變化的DOM進(jìn)行操作,從而提升性能

vue中的h函數(shù)

在講h函數(shù)之前,我們先來了解下虛擬dom:

虛擬dom簡單來說就是一個(gè)普通的JavaScript對象,包含tag,props,children三個(gè)屬性。。。

<div id="app">
  <p className="text">lxc</p>
</div>

上邊的HTML代碼轉(zhuǎn)為虛擬DOM如下:

{
    tag:"div",
    props:{
        id:"app"
    },
    children:[
        {
            tag:"p",
            props:{
                className:"text"
            },
            children:[
                "lxc"
            ]
        }
    ]
}

該對象就是所謂的虛擬dom,因?yàn)閐om對象是屬性結(jié)構(gòu),所以使用JavaScript對象就可以簡單表示。而原生dom有許多屬性、事件,即使創(chuàng)建一個(gè)空div也要付出昂貴的代價(jià)。而虛擬dom提升性能的點(diǎn)在于DOM發(fā)生變化的時(shí)候,通過diff算法對比,計(jì)算出需要更改的DOM,只對變化的DOM進(jìn)行操作,而不是更新整個(gè)視圖。。。

在vue腳手架中,我們經(jīng)常會(huì)看到這樣一段代碼:

  const app = new Vue({
    ··· ···
    render: h => h(App)
  })

這個(gè)render方法也可以寫成這樣:

  const app = new Vue({
    ··· ···
    render:function(createElement){
        return createElment(App)
    }
  })

h函數(shù)就是vue中的createElement方法,這個(gè)函數(shù)作用就是創(chuàng)建虛擬dom,追蹤dom變化的。。。

在看一個(gè)例子:寫一個(gè)main.jsx文件

function getVDOM(){
    return (
        <div id="app">
            <p nameProperty="lxc">my name is lxc</p>
        </div>
    )
}

使用bable編譯之后:

上邊代碼:最終html代碼會(huì)被編譯成h函數(shù)的渲染形式。返回的是一個(gè)虛擬DOM對象,通過diff算法,來追蹤自己要如何改變真實(shí)DOM。

function h(tag,props,...children){//h函數(shù),返回一個(gè)虛擬dom對象
    return {
        tag,
        props:props || {},
        children:children.flat()//扁平化數(shù)組,降至一維數(shù)組
    }
}

我們在看下官方文檔所說的createElement函數(shù),它返回的實(shí)際上不是一個(gè)DOM元素,更準(zhǔn)確的名字是:createNodeDescription(直譯為——創(chuàng)建節(jié)點(diǎn)描述),因?yàn)樗男畔?huì)告訴vue頁面上需要渲染什么樣的節(jié)點(diǎn),包括其子節(jié)點(diǎn)的描述信息。

我們把這樣的節(jié)點(diǎn)叫做:“虛擬節(jié)點(diǎn)(virtual node)”,也常簡寫為:“VNode”。(看了以上的案例相信在看剛這段話思路會(huì)更加清晰)

createElment參數(shù)(也就是h函數(shù))

我們還是以官方文檔的解釋來講,createElment函數(shù)接受三個(gè)參數(shù),分別是:

  • 參數(shù)一:tag(標(biāo)簽名)、組件的選項(xiàng)對象、函數(shù)(必選);
  • 參數(shù)二:一個(gè)對象,標(biāo)簽的屬性對應(yīng)的數(shù)據(jù)(可選);
  • 參數(shù)三:子級虛擬節(jié)點(diǎn),字符串形式或數(shù)組形式,子級虛擬節(jié)點(diǎn)也需要使用createElement構(gòu)建。

來一個(gè)小例子:

<!-- 在模板中渲染 -->
<div id="app">
    {{name}}
    <p>{{age}}</p>
</div>


<!-- 在render函數(shù)中渲染 -->
render:function(createElement){
  return createElement("div",{id:"lxc"},[this.name,createElement("p",this.age)])
}

上邊代碼,值得注意的是,如果父元素有文本內(nèi)容,在render函數(shù)中寫的時(shí)候,內(nèi)容寫在參數(shù)三——數(shù)組的第一個(gè)參數(shù)中。(建議大家動(dòng)手寫一寫,理解的會(huì)更透徹。)

在來一個(gè)官方文檔例子:

<!-- 在模板中渲染 -->
<ul v-if="items.length">
      <li v-for="item in items">{{item.name}}</li>
</ul>
<p v-else>No items</p>



<!-- 在render函數(shù)中渲染 -->
data:{
    items:[{name:"l"},{name:"x"},{name:"c"}]
},
render:function(createElement){
  if(this.items.length){
      return createElement("ul",this.items.map(function(ele){
            return createElement("li",ele.name)
      }))
  }else{
      return createElment("p","No items")  
  }
}

總結(jié)

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

相關(guān)文章

  • vue3 ts打包失敗ts類型校驗(yàn)未通過導(dǎo)致打包失敗的解決方案

    vue3 ts打包失敗ts類型校驗(yàn)未通過導(dǎo)致打包失敗的解決方案

    這篇文章主要介紹了vue3 ts打包失敗ts類型校驗(yàn)未通過導(dǎo)致打包失敗的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • 關(guān)于頁面刷新vuex數(shù)據(jù)消失問題解決方案

    關(guān)于頁面刷新vuex數(shù)據(jù)消失問題解決方案

    本篇文章主要介紹了關(guān)于頁面刷新vuex數(shù)據(jù)消失問題解決方案 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • ES6 Proxy實(shí)現(xiàn)Vue的變化檢測問題

    ES6 Proxy實(shí)現(xiàn)Vue的變化檢測問題

    Vue3.0將采用ES6 Proxy的形式重新實(shí)現(xiàn)Vue的變化檢測,在官方還沒給出新方法之前,我們先實(shí)現(xiàn)一個(gè)基于Proxy的變化檢測。感興趣的朋友跟隨小編一起看看吧
    2019-06-06
  • 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,支持自動(dòng)分頁,適用于較大區(qū)域的轉(zhuǎn)換
    2025-10-10
  • vue打印的對象在瀏覽器中顯示的問題分析

    vue打印的對象在瀏覽器中顯示的問題分析

    因?yàn)樵趘ue中對象都是用了代理重寫了get,由于get重寫也就導(dǎo)致了瀏覽器不能直接獲取到具體的值,因此才會(huì)在打印的時(shí)候?yàn)?..,手動(dòng)點(diǎn)擊展開才顯示具體的值,這篇文章主要介紹了為什么vue打印的對象在瀏覽器中顯示,需要的朋友可以參考下
    2024-04-04
  • electron-vue+electron-updater實(shí)現(xiàn)自動(dòng)更新(步驟源碼)

    electron-vue+electron-updater實(shí)現(xiàn)自動(dòng)更新(步驟源碼)

    這篇文章主要介紹了electron-vue+electron-updater實(shí)現(xiàn)自動(dòng)更新,步驟源碼包括autoUpdater.js操控更新js文件,main.js也就是package.json內(nèi)的main指向的js文件,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • 前端架構(gòu)vue動(dòng)態(tài)組件使用基礎(chǔ)教程

    前端架構(gòu)vue動(dòng)態(tài)組件使用基礎(chǔ)教程

    這篇文章主要為大家介紹了前端架構(gòu)vue動(dòng)態(tài)組件使用的基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-02-02
  • vue-router之解決addRoutes使用遇到的坑

    vue-router之解決addRoutes使用遇到的坑

    這篇文章主要介紹了vue-router之解決addRoutes使用遇到的坑,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue3+TypeScript埋點(diǎn)方面的應(yīng)用實(shí)踐

    Vue3+TypeScript埋點(diǎn)方面的應(yīng)用實(shí)踐

    本文詳細(xì)闡述了如何在Vue3中使用TypeScript實(shí)現(xiàn)埋點(diǎn)功能,包括全局注冊$track插件、Mixin實(shí)現(xiàn)全局埋點(diǎn)等,隨著Vue3的逐漸普及,在實(shí)際工作中采用Vue3+TypeScript實(shí)現(xiàn)埋點(diǎn)將會(huì)變得越來越流行
    2023-08-08
  • Vue2 element 表頭查詢功能實(shí)現(xiàn)代碼

    Vue2 element 表頭查詢功能實(shí)現(xiàn)代碼

    本文介紹Vue2中Element UI表格自定義表頭及查詢功能實(shí)現(xiàn),需通過slot-scope綁定數(shù)據(jù),注意Vue2.6+版本改用#header語法,并提供示例代碼說明,感興趣的朋友一起看看吧
    2025-07-07

最新評論

西安市| 望奎县| 台南市| 改则县| 长宁县| 全椒县| 咸丰县| 华宁县| 抚顺县| 鲁甸县| 屯门区| 温泉县| 那曲县| 田东县| 阳春市| 宁津县| 鄂州市| 阳山县| 海伦市| 汉源县| 楚雄市| 兴义市| 安义县| 壶关县| 贞丰县| 灌南县| 康马县| 满洲里市| 绥德县| 郁南县| 荆门市| 外汇| 河池市| 沽源县| 达州市| 博客| 开封县| 安康市| 洪泽县| 济南市| 沙田区|