vue中?render?函數(shù)功能與原理分析
1. 前言
在使用 vue-cli2 腳手架構(gòu)建項(xiàng)目時(shí),如果選擇了Runtime-only模式,那么在main.js文件中會(huì)有下面一段代碼:
有關(guān)Runtime + Compiler的介紹可以看這篇文章:Vue中 Runtime + Compiler 和 Runtime-only 兩種模式含義和區(qū)別
import Vue from 'vue'
import App from './App'
Vue.config.productionTip = false
new Vue({
el: '#app',
render: h => h(App)
})
2. 分析render函數(shù)
2.1 render 函數(shù)的作用
Vue 推薦在絕大多數(shù)情況下使用模板來(lái)創(chuàng)建你的 HTML。然而在一些場(chǎng)景中,真的需要 JavaScript 的完全編程的能力。這時(shí)可以用渲染函數(shù),它比模板更接近編譯器。
render 函數(shù)和 template 一樣都是創(chuàng)建 html 模板的,但是有些場(chǎng)景中用 template 實(shí)現(xiàn)起來(lái)代碼冗長(zhǎng)繁瑣而且有大量重復(fù),這時(shí)候就可以用 render 函數(shù)。
2.2 render 函數(shù)講解
render 函數(shù)即渲染函數(shù),它是個(gè)函數(shù),它的參數(shù) createElement 也是個(gè)函數(shù)。
上邊的代碼中 render: h => h(App) ,這是 ES6的箭頭函數(shù)的寫(xiě)法,可以把 h 當(dāng)作 createElement 的別名。所以這段代碼其實(shí)相當(dāng)于:
render: function (createElement) {
return createElement(App)
}
2.3 createElement 函數(shù)講解
這個(gè)函數(shù)的作用就是生成一個(gè) VNode節(jié)點(diǎn),render 函數(shù)得到這個(gè) VNode 節(jié)點(diǎn)之后,返回給 Vue.js 的 mount 函數(shù),渲染成真實(shí) DOM 節(jié)點(diǎn),并掛載到根節(jié)點(diǎn)上。
createElement 函數(shù)的返回值是 VNode(即:虛擬節(jié)點(diǎn))
有關(guān)對(duì) VNode 的介紹可以看這篇博客:VNode簡(jiǎn)介
createElement 函數(shù)的3個(gè)參數(shù)
- 一個(gè) HTML 標(biāo)簽字符串,組件選項(xiàng)對(duì)象,或者解析上述任何一種的一個(gè) async 異步函數(shù)。類(lèi)型:String | Object | Function。必需。
- 一個(gè)包含模板相關(guān)屬性的數(shù)據(jù)對(duì)象,你可以在 template 中使用這些特性。類(lèi)型:Object。可選。
- 子虛擬節(jié)點(diǎn) (VNodes),由 createElement() 構(gòu)建而成,也可以使用字符串來(lái)生成“文本虛擬節(jié)點(diǎn)”。類(lèi)型:String | Array。可選。
實(shí)現(xiàn)createElement函數(shù)
1、普通用法
// main.js文件
new Vue({
el: '#app',
render:function (createElement) {
//1.普通用法
// createElement(標(biāo)簽,{屬性},[內(nèi)容])
return createElement("h2",{class:"box"},['hello',createElement("button",["按鈕"])])
}
})
運(yùn)行效果如圖所示:
2、我們也可以自定義一個(gè)組件,傳遞給render函數(shù)
// ...
let Cpn = {
template:`<h2>{{message}}</h2>`,
data(){
return {
message:"我是組件"
}
}
}
new Vue({
el: '#app',
render:function (createElement) {
//2.使用組件
return createElement(Cpn)
}
})
運(yùn)行效果如圖所示:
3、既然我們能夠使用組件,那么App組件也是可以的
import Vue from 'vue'
import App from './App'
Vue.config.productionTip = false
new Vue({
el: '#app',
render:function (createElement) {
return createElement(App)
}
})
效果如圖所示:
3. 參考資料
render渲染函數(shù) — Vue.js官網(wǎng)
補(bǔ)充
關(guān)于Vue中 render: h => h(App) 的具體含義的理解
?一、問(wèn)題:
https://github.com/vuejs-templates/webpack-simple/blob/master/template/src/main.js
import Vue from 'vue'
import App from './App.vue'
new Vue({
? el: '#app',
? render: h => h(App)
})vue的代碼中有這么一段,令人第一眼對(duì)這個(gè) h 函數(shù)十分困惑??
二、原因:
經(jīng)過(guò)查找相關(guān)資料后發(fā)現(xiàn):
render: h => h(App) 是下面內(nèi)容的縮寫(xiě):
render: function (createElement) {
? ? return createElement(App);
}進(jìn)一步縮寫(xiě)為(ES6 語(yǔ)法):
render (createElement) {
? ? return createElement(App);
}再進(jìn)一步縮寫(xiě)為:
render (h){
? ? return h(App);
}按照 ES6 箭頭函數(shù)的寫(xiě)法,就得到了:
render:?h?=>?h(App);
其中 根據(jù) Vue.js 作者 Even You 在 Vue 的 issue 中的回復(fù),h 的含義如下:
It comes from the term "hyperscript", which is commonly used in many virtual-dom implementations. "Hyperscript" itself stands for "script that generates HTML structures" because HTML is the acronym for "hyper-text markup language".
它來(lái)自單詞 hyperscript,這個(gè)單詞通常用在 virtual-dom 的實(shí)現(xiàn)中。Hyperscript 本身是指
生成HTML 結(jié)構(gòu)的 script 腳本,因?yàn)?HTML 是 hyper-text markup language 的縮寫(xiě)(超文本標(biāo)記語(yǔ)言)
三、總結(jié):
h 函數(shù)的本質(zhì)是createElement 函數(shù),這個(gè)函數(shù)的作用就是生成一個(gè) VNode節(jié)點(diǎn),render 函數(shù)得到這個(gè) VNode 節(jié)點(diǎn)之后,返回給 Vue.js 的 mount 函數(shù),渲染成真實(shí) DOM 節(jié)點(diǎn),并掛載到根節(jié)點(diǎn)上
而之所以要 叫 h,根據(jù)作者解釋是,來(lái)源于 hyper script,
........
個(gè)人覺(jué)得可讀性差了很多,就算是外國(guó)人不經(jīng)解釋也很難理解這個(gè) h 函數(shù)
不如直接 createElement
- vue3模塊創(chuàng)建runtime-dom源碼解析
- Vue完整版和runtime版的區(qū)別詳解
- vue開(kāi)發(fā)runtime core中的虛擬節(jié)點(diǎn)示例詳解
- Vue.js和Vue.runtime.js區(qū)別淺析
- vue-next/runtime-core 源碼閱讀指南詳解
- Vue中使用localStorage存儲(chǔ)token并設(shè)置時(shí)效
- vue中destroyed方法及使用示例講解
- Vue中Number方法將字符串轉(zhuǎn)換為數(shù)字的過(guò)程
- Vue中 Runtime + Compiler 和 Runtime-only 兩種模式含義和區(qū)別詳解
相關(guān)文章
Vue中foreach數(shù)組與js中遍歷數(shù)組的寫(xiě)法說(shuō)明
這篇文章主要介紹了Vue中foreach數(shù)組與js中遍歷數(shù)組的寫(xiě)法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
vue在.js文件中如何進(jìn)行路由跳轉(zhuǎn)
這篇文章主要介紹了vue在.js文件中如何進(jìn)行路由跳轉(zhuǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Vue2?與?Vue3?的數(shù)據(jù)綁定原理及實(shí)現(xiàn)
這篇文章主要介紹了Vue2與Vue3的數(shù)據(jù)綁定原理及實(shí)現(xiàn),數(shù)據(jù)綁定是一種把用戶(hù)界面元素的屬性綁定到特定對(duì)象上面并使其同步的機(jī)制,使開(kāi)發(fā)人員免于編寫(xiě)同步視圖模型和視圖的邏輯2022-09-09
基于VUE.JS的移動(dòng)端框架Mint UI的使用
本篇文章主要介紹了基于VUE.JS的移動(dòng)端框架Mint UI的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
深入探究Vue中$nextTick的實(shí)現(xiàn)原理
這篇文章主要為大家詳細(xì)介紹Vue中$nextTick的實(shí)現(xiàn)原理,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Vue有一定的幫助,需要的小伙伴可以參考一下2023-06-06
vue項(xiàng)目部署到nginx/tomcat服務(wù)器的實(shí)現(xiàn)
這篇文章主要介紹了vue項(xiàng)目部署到nginx/tomcat服務(wù)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
vue過(guò)濾器實(shí)現(xiàn)日期格式化的案例分析
這篇文章主要介紹了vue過(guò)濾器實(shí)現(xiàn)日期格式化的案例分析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

