vue中?render?函數(shù)功能與原理分析
1. 前言
在使用 vue-cli2 腳手架構(gòu)建項(xiàng)目時(shí),如果選擇了Runtime-only模式,那么在main.js文件中會有下面一段代碼:
有關(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ù)情況下使用模板來創(chuàng)建你的 HTML。然而在一些場景中,真的需要 JavaScript 的完全編程的能力。這時(shí)可以用渲染函數(shù),它比模板更接近編譯器。
render 函數(shù)和 template 一樣都是創(chuàng)建 html 模板的,但是有些場景中用 template 實(shí)現(xiàn)起來代碼冗長繁瑣而且有大量重復(fù),這時(shí)候就可以用 render 函數(shù)。
2.2 render 函數(shù)講解
render 函數(shù)即渲染函數(shù),它是個(gè)函數(shù),它的參數(shù) createElement 也是個(gè)函數(shù)。
上邊的代碼中 render: h => h(App) ,這是 ES6的箭頭函數(shù)的寫法,可以把 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)對 VNode 的介紹可以看這篇博客:VNode簡介
createElement 函數(shù)的3個(gè)參數(shù)
- 一個(gè) HTML 標(biāo)簽字符串,組件選項(xiàng)對象,或者解析上述任何一種的一個(gè) async 異步函數(shù)。類型:String | Object | Function。必需。
- 一個(gè)包含模板相關(guān)屬性的數(shù)據(jù)對象,你可以在 template 中使用這些特性。類型:Object??蛇x。
- 子虛擬節(jié)點(diǎn) (VNodes),由 createElement() 構(gòu)建而成,也可以使用字符串來生成“文本虛擬節(jié)點(diǎn)”。類型:String | Array??蛇x。
實(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) 的具體含義的理解
?一、問題:
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的代碼中有這么一段,令人第一眼對這個(gè) h 函數(shù)十分困惑??
二、原因:
經(jīng)過查找相關(guān)資料后發(fā)現(xiàn):
render: h => h(App) 是下面內(nèi)容的縮寫:
render: function (createElement) {
? ? return createElement(App);
}進(jìn)一步縮寫為(ES6 語法):
render (createElement) {
? ? return createElement(App);
}再進(jìn)一步縮寫為:
render (h){
? ? return h(App);
}按照 ES6 箭頭函數(shù)的寫法,就得到了:
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".
它來自單詞 hyperscript,這個(gè)單詞通常用在 virtual-dom 的實(shí)現(xiàn)中。Hyperscript 本身是指
生成HTML 結(jié)構(gòu)的 script 腳本,因?yàn)?HTML 是 hyper-text markup language 的縮寫(超文本標(biāo)記語言)
三、總結(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ù)作者解釋是,來源于 hyper script,
........
個(gè)人覺得可讀性差了很多,就算是外國人不經(jīng)解釋也很難理解這個(gè) h 函數(shù)
不如直接 createElement
- vue3模塊創(chuàng)建runtime-dom源碼解析
- Vue完整版和runtime版的區(qū)別詳解
- vue開發(fā)runtime core中的虛擬節(jié)點(diǎn)示例詳解
- Vue.js和Vue.runtime.js區(qū)別淺析
- vue-next/runtime-core 源碼閱讀指南詳解
- Vue中使用localStorage存儲token并設(shè)置時(shí)效
- vue中destroyed方法及使用示例講解
- Vue中Number方法將字符串轉(zhuǎn)換為數(shù)字的過程
- Vue中 Runtime + Compiler 和 Runtime-only 兩種模式含義和區(qū)別詳解
相關(guān)文章
Vue中foreach數(shù)組與js中遍歷數(shù)組的寫法說明
這篇文章主要介紹了Vue中foreach數(shù)組與js中遍歷數(shù)組的寫法說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
vue在.js文件中如何進(jìn)行路由跳轉(zhuǎn)
這篇文章主要介紹了vue在.js文件中如何進(jìn)行路由跳轉(zhuǎn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Vue2?與?Vue3?的數(shù)據(jù)綁定原理及實(shí)現(xiàn)
這篇文章主要介紹了Vue2與Vue3的數(shù)據(jù)綁定原理及實(shí)現(xiàn),數(shù)據(jù)綁定是一種把用戶界面元素的屬性綁定到特定對象上面并使其同步的機(jī)制,使開發(fā)人員免于編寫同步視圖模型和視圖的邏輯2022-09-09
深入探究Vue中$nextTick的實(shí)現(xiàn)原理
這篇文章主要為大家詳細(xì)介紹Vue中$nextTick的實(shí)現(xiàn)原理,文中的示例代碼講解詳細(xì),對我們深入了解Vue有一定的幫助,需要的小伙伴可以參考一下2023-06-06
vue項(xiàng)目部署到nginx/tomcat服務(wù)器的實(shí)現(xiàn)
這篇文章主要介紹了vue項(xiàng)目部署到nginx/tomcat服務(wù)器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

