国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Vue源碼解析(3)-AST到VNode過(guò)程

Rainie / 1703人閱讀

摘要:模版如下我是選項(xiàng)模板為我是選項(xiàng)模板對(duì)應(yīng)我是選項(xiàng)模板為對(duì)應(yīng)的為下把等方法掛載到原型上這樣就是執(zhí)行就是執(zhí)行就是執(zhí)行在下標(biāo)簽關(guān)于這個(gè)節(jié)點(diǎn)的值,包括等子節(jié)點(diǎn)實(shí)例對(duì)象創(chuàng)建對(duì)象關(guān)于這個(gè)節(jié)點(diǎn)的值,包括等子節(jié)點(diǎn)文本內(nèi)容真實(shí)的節(jié)點(diǎn)創(chuàng)建這個(gè)的上下文下面分別

模版如下

我是選項(xiàng)模板3

{{number}}

{{message}}

1
11
12
2
3
4
5

options.render為

function anonymous( ) { 
    with(this){
      return _c(
        "div",
        [_c("h1",{staticStyle:{"color":"red"}},[_v("我是選項(xiàng)模板3")])
        ,_v(" "),_c("p",[_v(_s(number))]),
        _v(" "),
        _c("p",[_v(_s(message))]),
        _v(" "),
        _m(0)]
        )
    } 
  }

對(duì)應(yīng)

 

我是選項(xiàng)模板3

{{number}}

{{message}}

options.staticRenderFns為 [0]

 function anonymous() {
   with(this){
     return _c("div",[
              _c("div",[_v("
          1
          "),
                _c("div",[_v("11")]),_v(" "),
                _c("div",[_v("12")])
              ]),_v(" "),
              _c("div",[_v("2")]),_v(" "),
              _c("div",[_v("3")]),_v(" "),
              _c("div",[_v("4")]),_v(" "),
              _c("div",[_v("5")])
            ])
    }
  }

對(duì)應(yīng)的template為

  
1
11
12
2
3
4
5

render-helpers 下 index.js

export function installRenderHelpers (target) {
  target._o = markOnce
  target._n = toNumber
  target._s = toString
  target._l = renderList
  target._t = renderSlot
  target._q = looseEqual
  target._i = looseIndexOf
  target._m = renderStatic
  target._f = resolveFilter
  target._k = checkKeyCodes
  target._b = bindObjectProps
  target._v = createTextVNode
  target._e = createEmptyVNode
  target._u = resolveScopedSlots
  target._g = bindObjectListeners
}

render.js

function renderMixin (Vue) {
   //把_v,_m等方法掛載到vue原型上
 installRenderHelpers(Vue.prototype)
}
function initRender (vm) {
 vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)
}

這樣this._c就是執(zhí)行createElement
this._m就是執(zhí)行renderStatic
_v就是執(zhí)行createTextVNode

在vdom下create-element.js

tag  // 標(biāo)簽
data    // 關(guān)于這個(gè)節(jié)點(diǎn)的data值,包括attrs,style,hook等
children  // 子vdom節(jié)點(diǎn)
context  // vue實(shí)例對(duì)象
function _createElement(context,tag,data,children,normalizationType) {
  vnode = new VNode(
        tag, data, children,
        undefined, undefined, context
  )
 return vnode
}

創(chuàng)建vdom對(duì)象

vnode

class VNode {
    constructor (
    tag,
    data,     // 關(guān)于這個(gè)節(jié)點(diǎn)的data值,包括attrs,style,hook等
    children, // 子vdom節(jié)點(diǎn)
    text,     // 文本內(nèi)容
    elm,      // 真實(shí)的dom節(jié)點(diǎn)
    context,  // 創(chuàng)建這個(gè)vdom的上下文
    componentOptions,
    asyncFactory
  ) {
    this.tag = tag
    this.data = data
    this.children = children
    this.text = text
    this.elm = elm
    this.ns = undefined
    this.context = context
    this.fnContext = undefined
    this.fnOptions = undefined
    this.fnScopeId = undefined
    this.key = data && data.key
    this.componentOptions = componentOptions
    this.componentInstance = undefined
    this.parent = undefined
    this.raw = false
    this.isStatic = false
    this.isRootInsert = true
    this.isComment = false
    this.isCloned = false
    this.isOnce = false
    this.asyncFactory = asyncFactory
    this.asyncMeta = undefined
    this.isAsyncPlaceholder = false
  }
}

下面dom分別依次執(zhí)行,先渲染里面然后再渲染外層

1.   [_c("h1",{staticStyle:{"color":"red"}},[_v("我是選項(xiàng)模板3")])
  

我是選項(xiàng)模板3

2._c("p",[_v(_s(number))]

{{number}}

3._c("p",[_v(_s(message))])

{{message}}

4._m(0)是緩存渲染數(shù) function anonymous() { with(this){ return _c("div",[ _c("div",[_v(" 1 "), _c("div",[_v("11")]),_v(" "), _c("div",[_v("12")]) ]),_v(" "), _c("div",[_v("2")]),_v(" "), _c("div",[_v("3")]),_v(" "), _c("div",[_v("4")]),_v(" "), _c("div",[_v("5")]) ]) } } vdom順序依次為 (1)
11
(2)
12
(3)
1
11
12
(4)
2
(5)
3
(6)
4
(7)
5
(8)
1
11
12
2
3
4
5
(9)

我是選項(xiàng)模板3

{{number}}

{{message}}

1
11
12
2
3
4
5

最后一次執(zhí)行最外面的

render-static.js給m[0]靜態(tài)樹(shù)做了緩存處理

renderStatic (
  index,
  isInFor
) {
//緩存處理
 const cached = this._staticTrees || (this._staticTrees = [])
// staticRenderFns被執(zhí)行
tree = cached[index] = this.$options.staticRenderFns[index].call(
    this._renderProxy, // 代理可以理解為vue實(shí)例對(duì)象,多了一些提示處理
    null,
    this // for render fns generated for functional component templates
)
markStatic(tree, `__static__${index}`, false)
return tree
}

function markStatic (
  tree,
  key,
  isOnce
) {
function markStaticNode (node, key, isOnce) {
  node.isStatic = true  //靜態(tài)樹(shù)為true
  node.key = key  // `__static__${index}` 標(biāo)志
  node.isOnce = isOnce // 是否是v-once
}
markStaticNode(node, key, isOnce)
}

然后又重新執(zhí)行

function anonymous(
) {
with(this){return _c("div",[_c("div",[_v("
          1
          "),_c("div",[_v("11")]),_v(" "),_c("div",[_v("12")])]),_v(" "),_c("div",[_v("2")]),_v(" "),_c("div",[_v("3")]),_v(" "),_c("div",[_v("4")]),_v(" "),_c("div",[_v("5")])])}
}

打印render()結(jié)果
靜態(tài)樹(shù)有了isStatic和key值

補(bǔ)充個(gè)小問(wèn)題 render函數(shù)里number 還是變量是什么時(shí)候變成數(shù)字的
因?yàn)閒unction有個(gè)with(this){}改變了作用域,當(dāng)this.render()執(zhí)行時(shí)候,那么this就是指得vue, $options.data 已經(jīng)通過(guò)defineProperty代理到了vue下,訪問(wèn)this.data就是訪問(wèn)$options.data 所以number就是數(shù)字啦

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97393.html

相關(guān)文章

  • Vue 2.0源碼學(xué)習(xí)

    摘要:今年的月日,的版本正式發(fā)布了,其中核心代碼都進(jìn)行了重寫(xiě),于是就專(zhuān)門(mén)花時(shí)間,對(duì)的源碼進(jìn)行了學(xué)習(xí)。本篇文章就是源碼學(xué)習(xí)的總結(jié)。實(shí)現(xiàn)了并且將靜態(tài)子樹(shù)進(jìn)行了提取,減少界面重繪時(shí)的對(duì)比。的最新源碼可以去獲得。 Vue2.0介紹 從去年9月份了解到Vue后,就被他簡(jiǎn)潔的API所吸引。1.0版本正式發(fā)布后,就在業(yè)務(wù)中開(kāi)始使用,將原先jQuery的功能逐步的進(jìn)行遷移。 今年的10月1日,Vue的2...

    Joyven 評(píng)論0 收藏0
  • vue源碼閱讀之?dāng)?shù)據(jù)渲染過(guò)程

    摘要:圖在中應(yīng)用三數(shù)據(jù)渲染過(guò)程數(shù)據(jù)綁定實(shí)現(xiàn)邏輯本節(jié)正式分析從到數(shù)據(jù)渲染到頁(yè)面的過(guò)程,在中定義了一個(gè)的構(gòu)造函數(shù)。一、概述 vue已是目前國(guó)內(nèi)前端web端三分天下之一,也是工作中主要技術(shù)棧之一。在日常使用中知其然也好奇著所以然,因此嘗試閱讀vue源碼并進(jìn)行總結(jié)。本文旨在梳理初始化頁(yè)面時(shí)data中的數(shù)據(jù)是如何渲染到頁(yè)面上的。本文將帶著這個(gè)疑問(wèn)一點(diǎn)點(diǎn)追究vue的思路。總體來(lái)說(shuō)vue模版渲染大致流程如圖1所...

    AlphaGooo 評(píng)論0 收藏0
  • Vue源碼解析(1)-模版渲染

    摘要:首先在里調(diào)用函數(shù)把獲取相應(yīng)傳遞過(guò)去里在原型上定義方法對(duì)瀏覽器的怪癖做兼容布爾值。對(duì)瀏覽器的怪癖做兼容布爾值。 首先在init.js里調(diào)用$mount函數(shù)把el #app獲取相應(yīng)dom傳遞過(guò)去 Vue.prototype._init = function (options) { ... if (vm.$options.el) { vm.$mount(vm.$opt...

    k00baa 評(píng)論0 收藏0
  • Vue源碼解析(一)-模版渲染

    摘要:接下來(lái)我們分析下是如何調(diào)用的,這就涉及到了經(jīng)典的機(jī)制此處先簡(jiǎn)單介紹,下一篇會(huì)有較詳細(xì)的分析。 Vue demo 先給出vue簡(jiǎn)單的使用demo,通過(guò)創(chuàng)建一個(gè)Vue的實(shí)例,將被替換成template模版中的內(nèi)容,a,b的值也會(huì)被換成data屬性的值 var vm = new Vue({ el: #app, template: ` {{a}} {{b}} ...

    KitorinZero 評(píng)論0 收藏0
  • Vue源碼解析之Template轉(zhuǎn)化為AST

    摘要:下面用具體代碼進(jìn)行分析。匹配不到那么就是開(kāi)始標(biāo)簽,調(diào)用函數(shù)解析。如這里的轉(zhuǎn)化為加上是為了的下一步轉(zhuǎn)為函數(shù),本文中暫時(shí)不會(huì)用到。再把轉(zhuǎn)化后的內(nèi)容進(jìn)。 什么是AST 在Vue的mount過(guò)程中,template會(huì)被編譯成AST語(yǔ)法樹(shù),AST是指抽象語(yǔ)法樹(shù)(abstract syntax tree或者縮寫(xiě)為AST),或者語(yǔ)法樹(shù)(syntax tree),是源代碼的抽象語(yǔ)法結(jié)構(gòu)的樹(shù)狀表現(xiàn)形式。...

    huangjinnan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<