new Vue({
router,
store,
//components: { App } vue1.0的寫法
render: h => h(App) vue2.0的寫法
}).$mount('#app')
注意參數(shù)是 App,這個在import里面是這樣的:
import App from './App.vue'
render函數(shù)是渲染一個視圖,然后提供給el掛載,如果沒有render那頁面什么都不會出來
相當(dāng)于就是將App.vue頁面渲染出來攻走,render 函數(shù)得到這個 VNode 節(jié)點之后,返回給 Vue.js 的 mount 函數(shù)此再,渲染成真實 DOM 節(jié)點昔搂,并掛載到根節(jié)點上,
根結(jié)點在index.html下面有一個#app的div上
最后的效果就是將:App.vue頁面渲染出來输拇,插入到index.html里面一個叫做
app的div塊上
<div id="app"></div>
<!-- built files will be auto injected -->
并且摘符,new 出來的vue,掛載到App.vue組件上策吠;
new Vue({
// el是實例掛載點逛裤,會將根組件替換掉原文檔中id為 app 標(biāo)簽
el: '#app',
// 通過render函數(shù)渲染
render: h => {
// 這里App是根組件
h(App)
}
})
vue.2.0的渲染過程:
1.首先需要了解這是 es 6 的語法,表示 Vue 實例選項對象的 render 方法作為一個函數(shù)奴曙,接受傳入的參數(shù) h 函數(shù)别凹,返回 h(App) 的函數(shù)調(diào)用結(jié)果。
2.其次洽糟,Vue 在創(chuàng)建 Vue 實例時炉菲,通過調(diào)用 render 方法來渲染實例的 DOM 樹堕战。
3.最后,Vue 在調(diào)用 render 方法時拍霜,會傳入一個 createElement 函數(shù)作為參數(shù)嘱丢,也就是這里的 h 的實參是 createElement 函數(shù),然后 createElement 會以 APP 為參數(shù)進(jìn)行調(diào)用祠饺,關(guān)于 createElement 函數(shù)的參數(shù)說明參見:Element-Arguments
結(jié)合一下官方文檔的代碼便可以很清晰的了解Vue2.0 render:h => h(App)的渲染過程越驻。
1 render: function (createElement) {
2 return createElement(
3 'h' + this.level, // tag name 標(biāo)簽名稱
4 this.$slots.default // 子組件中的陣列
5 )
6 }
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 的回復(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缀旁,這個單詞通常用在 virtual-dom 的實現(xiàn)中。Hyperscript 本身是指
生成HTML 結(jié)構(gòu)的 script 腳本勺鸦,因為 HTML 是 hyper-text markup language 的縮寫(超文本標(biāo)記語言)
理解:createElement 函數(shù)是用來生成 HTML DOM 元素的并巍,也就是上文中的 generate HTML structures,也就是 Hyperscript换途,這樣作者才把 createElement 簡寫成 h懊渡。
Vue.js 里面的 createElement 函數(shù),這個函數(shù)的作用就是生成一個 VNode節(jié)點军拟,render 函數(shù)得到這個 VNode 節(jié)點之后剃执,返回給 Vue.js 的 mount 函數(shù),渲染成真實 DOM 節(jié)點懈息,并掛載到根節(jié)點上肾档。
還有另外一種寫法效果是一樣的:
import App from './App'
new Vue({
el: '#root',
template: '<App></App>',
components: {
App
}
})
直接解析template下的id為app的div
我的理解是這行代碼:直接給綁定節(jié)點渲染一個vue組件
createElement 到底會返回什么呢?其實不是一個實際的 DOM 元素漓拾。createElement更準(zhǔn)確的名字可能是 createNodeDescription阁最,因為它所包含的信息會告訴 Vue 頁面上需要渲染什么樣的節(jié)點,及其子節(jié)點骇两。我們把這樣的節(jié)點描述為“虛擬節(jié)點 (Virtual Node)”速种,也常簡寫它為“VNode”〉颓В“虛擬 DOM”是我們對由 Vue 組件樹建立起來的整個 VNode 樹的稱呼配阵。
總體來說,揣測認(rèn)為示血,Vue 在調(diào)用 render 方法時棋傍,會傳入一個 createElement 函數(shù)作為參數(shù),也就是這里的 h 的實參是 createElement 函數(shù)难审,這個函數(shù)的作用就是生成一個 VNode節(jié)點瘫拣,render 函數(shù)得到這個 VNode 節(jié)點之后,調(diào)用了 mount 方法告喊,渲染成真實 DOM 節(jié)點麸拄,并掛載到(通常是div app)??節(jié)點上派昧。