欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue渲染過程淺析

 更新時間:2019年03月14日 09:33:33   作者:火星田園犬  
這篇文章主要介紹了Vue渲染過程淺析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Vue 推薦在絕大多數(shù)情況下使用 template 來創(chuàng)建你的 HTML。但是模板畢竟是模板,不是真實的dom節(jié)點。從模板到真實dom節(jié)點還需要經(jīng)過一些步驟

  1. 把模板編譯為render函數(shù)
  2. 實例進行掛載, 根據(jù)根節(jié)點render函數(shù)的調(diào)用,遞歸的生成虛擬dom
  3. 對比虛擬dom,渲染到真實dom
  4. 組件內(nèi)部data發(fā)生變化,組件和子組件引用data作為props重新調(diào)用render函數(shù),生成虛擬dom, 返回到步驟3

第一步: 模板到render

在我們使用Vue的組件化進行開發(fā)應用的時候, 如果仔細的查看我們要引入的組件, 例子如下

// App.vue 
<template>
  <div>
    hello word
  </div>
</template>

<script>

export default {
}

</script>

<style>

</style>

在我們的主入口main.js

import Vue from 'vue'
import App from './App'

console.log(App)

new Vue({
 render: h => h(App)
}).$mount('#app')

我們能夠看到在我們引入的App這個模塊,里面是一個對象,對象里面存在一個方法叫做render。在說render函數(shù)之前,我們可以想一想,每一次加載一個組件,然后對模板進行解析,解析完后,生成Dom,掛載到頁面上。這樣會導致效率很低效。而使用Vue-cli進行組件化開發(fā),在我們引入組件的后,其實會有一個解析器(vue-loader)對此模板進行了解析,生成了render函數(shù)。當然,如果沒有通過解析器解析為render函數(shù),也沒有關系,在組件第一次掛載的時候,Vue會自己進行解析。源碼請參考: https://github.com/vuejs/vue/blob/dev/src/platforms/web/entry-runtime-with-compiler.js

這樣,能保證組件每次調(diào)用的都是render函數(shù),使用render函數(shù)生成VNode。

第二步:虛擬節(jié)點VNode

我們把Vue的實例掛載到#app, 會調(diào)用實例里面的render方法,生成虛擬DOM。來看看什么是虛擬節(jié)點,把例子修改一下。

new Vue({
 render: h => {
  let root = h(App)
  console.log('root:', root)
  return root
 }
}).$mount('#app')

上面生成的VNode就是虛擬節(jié)點,虛擬節(jié)點里面有一個屬性elm, 這個屬性指向真實的DOM節(jié)點。因為VNode指向了真實的DOM節(jié)點,那么虛擬節(jié)點經(jīng)過對比后,生成的DOM節(jié)點就可以直接進行替換。

這樣有什么好處呢?

一個組件對象,如果內(nèi)部的data發(fā)生變化,觸發(fā)了render函數(shù),重新生成了VNode節(jié)點。那么就可以直接找到所對應的節(jié)點,然后直接替換。那么這個過程只會在本組件內(nèi)發(fā)生,不會影響其他的組件。于是組件與組件是隔離的。
例子如下:

// main.js
const root = new Vue({
 data: {
  state: true
 },
 mounted() {
  setTimeout(() => {
   console.log(this)
   this.state = false
  }, 1000)
 },
 render: function(h) {
  const { state } = this // state 變化重新觸發(fā)render
  let root = h(App)
  console.log('root:', root)
  return root
 }
}).$mount('#app')
// App.vue
<script>
export default {
 render: (h) => {
  let app = h('h1', ['hello world'])
  console.log('app:', app)
  return app
 }
}
</script>


我們可以看到,當main.js中重新觸發(fā)render函數(shù)的時候,render方法里面有引用App.vue這個子組件。但是并沒有觸發(fā)App.vue組件的的render函數(shù)。

在一個組件內(nèi),什么情況會觸發(fā)render?。

如何才能觸發(fā)組件的render

數(shù)據(jù)劫持是Vue的一大特色,原理官方已經(jīng)講的很多了深入響應式原理。在我們給組件的data的屬性進行的賦值的時候(set),此屬性如果在組件內(nèi)部初次渲染過程被引用(data的屬性被訪問,也就是數(shù)據(jù)劫持的get), 包括生命周期方法或者render方法。于是會觸發(fā)組件的update(beforeUpdate -> render -> updated)。

注: 為了防止data被多次set從而觸發(fā)多次update, Vue把update存放到異步隊列中。這樣就能保證多次data的set只會觸發(fā)一次update。

當props會觸發(fā)組件的重新渲染是怎么發(fā)生的呢?

把父組件的data通過props傳遞給子組件的時候,子組件在初次渲染的時候生命周期或者render方法,有調(diào)用data相關的props的屬性, 這樣子組件也被添加到父組件的data的相關屬性依賴中,這樣父組件的data在set的時候,就相當于觸發(fā)自身和子組件的update。

例子如下:

// main.vue
import Vue from 'vue'
import App from './App'

const root = new Vue({
 data: {
  state: false
 },
 mounted() {
  setTimeout(() => {
   this.state = true
  }, 1000)
 },
 render: function(h) {
  const { state } = this // state 變化重新觸發(fā)render
  let root = h(App, { props: { status: state } })
  console.log('root:', root)
  return root
 }
}).$mount('#app')

window.root = root
// App.vue
<script>
export default {
 props: {
  status: Boolean
 },
 render: function (h){
  const { status } = this
  let app = h('h1', ['hello world'])
  console.log('app:', app)
  return app
 }
}
</script>

截圖如下:


main.js中 state 狀態(tài)發(fā)生了變化,由false => true, 觸發(fā)了自身與子組件的render方法。

補充

上面的內(nèi)容是本人的一些使用心得,由于水平有限, 內(nèi)容有些錯誤或者表達不當。多歡迎大神來指導?。。?/p>

PS:vue渲染過程的{{xxx}}顯示的解決辦法

這是由于瀏覽器的渲染機制導致的,瀏覽器是從頭到尾  如果你的js引用在底部,那么瀏覽器會先加載dom此時,你用于渲染的{{}}識別符,因為還沒讀到該識別符對應的js文件,所以會被解析為字符串而顯示在頁面中,我們可以用過自定義屬性v-cloak解決,

實例對象對應標簽中加入 v-cloak:

<div id="wrap" v-cloak>

然后在css中給定義屬性選擇器 

  [v-cloak]{

  display:none

}

vue實例創(chuàng)建完成后會把v-cloak去掉,在沒創(chuàng)建實例對象時,該標簽內(nèi)的內(nèi)容都會被隱藏

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • vue2中引用及使用 better-scroll的方法詳解

    vue2中引用及使用 better-scroll的方法詳解

    這篇文章主要介紹了vue2中引用better-scroll和使用 better-scroll的方法,使用時有三個要點及注意事項在文中給大家詳細介紹 ,需要的朋友可以參考下
    2018-11-11
  • vue組件之Alert的實現(xiàn)代碼

    vue組件之Alert的實現(xiàn)代碼

    本篇文章主要介紹了vue組件之Alert的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • vue通過style或者class改變樣式的實例代碼

    vue通過style或者class改變樣式的實例代碼

    這篇文章主要介紹了vue通過style或者class改變樣式的實例代碼,在文中給大家提到了vue的一些樣式(class/style)綁定,需要的朋友可以參考下
    2018-10-10
  • Vue3自定義打印實現(xiàn)原理詳解

    Vue3自定義打印實現(xiàn)原理詳解

    近接觸到了一個 Vue3 的打印需求,我發(fā)現(xiàn)自己雖然從事前端開發(fā)已有多年,但對如何實現(xiàn)自定義打印還沒有深入研究,一般都是找現(xiàn)成的庫來解決問題,借這次的機會研究了一下如何實現(xiàn)自定義打印,需要的朋友可以參考下
    2024-07-07
  • vue.js根據(jù)代碼運行環(huán)境選擇baseurl的方法

    vue.js根據(jù)代碼運行環(huán)境選擇baseurl的方法

    本篇文章主要介紹了vue.js根據(jù)代碼運行環(huán)境選擇baseurl的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • vue3父子傳值實現(xiàn)彈框功能的示例詳解

    vue3父子傳值實現(xiàn)彈框功能的示例詳解

    這篇文章主要為大家詳細介紹了vue3如何利用父子傳值實現(xiàn)彈框功能,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • vue 組件基礎知識總結(jié)

    vue 組件基礎知識總結(jié)

    這篇文章主要介紹了vue 組件基礎知識的相關資料,幫助大家更好的理解和使用vue的組件,感興趣的朋友可以了解下
    2021-01-01
  • 在Vue3中處理異步API調(diào)用并更新表單數(shù)據(jù)的方法示例

    在Vue3中處理異步API調(diào)用并更新表單數(shù)據(jù)的方法示例

    這篇文章主要介紹了如何在Vue3中處理異步API調(diào)用并更新表單數(shù)據(jù)(附Demo),文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • Vue圖片懶加載之Vue-Lazyload的使用

    Vue圖片懶加載之Vue-Lazyload的使用

    懶加載就是延時加載,即當需要用到的時候再去加載,本文主要介紹了Vue圖片懶加載之Vue-Lazyload的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Vue自定義省市區(qū)三級聯(lián)動

    Vue自定義省市區(qū)三級聯(lián)動

    這篇文章主要為大家詳細介紹了Vue自定義省市區(qū)三級聯(lián)動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論