久久精品中文字幕免费_91香蕉国产亚洲一区二区三区_国产精品巨作无遮拦_亚洲人成电影

    <center id="oy65s"><ol id="oy65s"></ol></center>

  • <menu id="oy65s"></menu>
    當(dāng)前位置:首頁 > 足球資訊 > 正文內(nèi)容

    vue 源碼探索(二)

    杏彩體育2年前 (2023-01-28)足球資訊50

    前言

    通過上一節(jié) vue 源碼探索(一)我們已經(jīng)基本掌握 vue 的目錄結(jié)構(gòu),接下來我們講解數(shù)據(jù)驅(qū)動(dòng)

    數(shù)據(jù)驅(qū)動(dòng)

    數(shù)據(jù)驅(qū)動(dòng)是指網(wǎng)頁中所見的視圖由結(jié)構(gòu)化數(shù)據(jù)驅(qū)動(dòng)生成,對(duì)DOM的操作不是直接的增刪改,而是通過修改對(duì)應(yīng)數(shù)據(jù)間接操作DOM。優(yōu)勢(shì)是數(shù)據(jù)和視圖解耦,便于維護(hù)。

    <div id="app"> {{ message }} </div> let app = new Vue({ el: #app, data: { message: Hello World } }) // Hello World

    上面示例會(huì)輸出親切的 hello world 字樣。

    new vue 發(fā)生了什么?

    通過new vue 我們實(shí)例化一個(gè) vue 對(duì)象

    // https://github.com/vuejs/vue/blob/dev/src/core/instance/index.js function Vue (options) { if (process.env.NODE_ENV !== production && !(this instanceof Vue) ) { warn(Vue is a constructor and should be called with the `new` keyword) } this._init(options) }

    然后調(diào)用 this._init 方法設(shè)置對(duì)應(yīng)參數(shù)

    Vue.prototype._init = function (options?: Object) { const vm: Component = this // a uid vm._uid = uid++ let startTag, endTag /* istanbul ignore if */ if (process.env.NODE_ENV !== production && config.performance && mark) { startTag = `vue-perf-start:${vm._uid}` endTag = `vue-perf-end:${vm._uid}` mark(startTag) } ... ... if (vm.$options.el) { vm.$mount(vm.$options.el) }

    vue 初始化主要就干了幾件事情,合并配置,初始化生命周期,初始化渲染,初始化 data , props, computed, watcher。

    小節(jié)

    初始化過程主干負(fù)責(zé)基本校驗(yàn),簡(jiǎn)單賦值,通過具體功能函數(shù)執(zhí)行對(duì)應(yīng)功能。最后將 el 進(jìn)行掛載,掛載的目的就是把模板渲染成最終的 DOM。

    vue 掛載機(jī)制

    通過 compiler 版本的 $mount 實(shí)現(xiàn)分析掛載機(jī)制,部分分析見代碼注釋

    // https://github.com/vuejs/vue/blob/dev/src/platforms/web/entry-runtime-with-compiler.js const mount = Vue.prototype.$mount Vue.prototype.$mount = function ( el?: string | Element, hydrating?: boolean ): Component { el = el && query(el) /* el 不能為 body 或者 html 節(jié)點(diǎn) */ if (el === document.body || el === document.documentElement) { process.env.NODE_ENV !== production && warn( `Do not mount Vue to <html> or <body> - mount to normal elements instead.` ) return this } const options = this.$options /** 如果沒有定義 render 方法,則會(huì)把 el 或者 template 字符串轉(zhuǎn)換成 render 方法。 這里我們要牢記,在 Vue 2.0 版本中, 所有 Vue 的組件的渲染最終都需要 render 方法, 無論我們是用單文件 .vue 方式開發(fā)組件, 還是寫了 el 或者 template 屬性, 最終都會(huì)轉(zhuǎn)換成 render 方法, 那么這個(gè)過程是 Vue 的一個(gè)“在線編譯”的過程, 它是調(diào)用 compileToFunctions 方法實(shí)現(xiàn)的, 編譯過程我們之后會(huì)介紹。最后,調(diào)用原先原型上的 $mount 方法掛載。 */ if (!options.render) { let template = options.template if (template) { if (typeof template === string) { if (template.charAt(0) === #) { template = idToTemplate(template) /* istanbul ignore if */ if (process.env.NODE_ENV !== production && !template) { warn( `Template element not found or is empty: ${options.template}`, this ) } } } else if (template.nodeType) { template = template.innerHTML } else { if (process.env.NODE_ENV !== production) { warn(invalid template option: + template, this) } return this } } else if (el) { template = getOuterHTML(el) } if (template) { /* istanbul ignore if */ if (process.env.NODE_ENV !== production && config.performance && mark) { mark(compile) } const { render, staticRenderFns } = compileToFunctions(template, { outputSourceRange: process.env.NODE_ENV !== production, shouldDecodeNewlines, shouldDecodeNewlinesForHref, delimiters: options.delimiters, comments: options.comments }, this) options.render = render options.staticRenderFns = staticRenderFns /* istanbul ignore if */ if (process.env.NODE_ENV !== production && config.performance && mark) { mark(compile end) measure(`vue ${this._name} compile`, compile, compile end) } } } return mount.call(this, el, hydrating) })

    $mount 方法支持傳入 2 個(gè)參數(shù),第一個(gè)是 el,它表示掛載的元素,可以是字符串,也可以是 DOM 對(duì)象,如果是字符串在瀏覽器環(huán)境下會(huì)調(diào)用 query 方法轉(zhuǎn)換成 DOM 對(duì)象的。第二個(gè)參數(shù)是和服務(wù)端渲染相關(guān),在瀏覽器環(huán)境下我們不需要傳第二個(gè)參數(shù)。

    $mount 方法實(shí)際上會(huì)去調(diào)用 mountComponent 方法,這個(gè)方法定義在

    export function mountComponent ( vm: Component, el: ?Element, hydrating?: boolean ): Component { vm.$el = el if (!vm.$options.render) { vm.$options.render = createEmptyVNode if (process.env.NODE_ENV !== production) { /* istanbul ignore if */ if ((vm.$options.template && vm.$options.template.charAt(0) !== #) || vm.$options.el || el) { warn( You are using the runtime-only build of Vue where the template + compiler is not available. Either pre-compile the templates into + render functions, or use the compiler-included build., vm ) } else { warn( Failed to mount component: template or render function not defined., vm ) } } }

    mountComponent 核心就是先實(shí)例化一個(gè)渲染W(wǎng)atcher,在它的回調(diào)函數(shù)中會(huì)調(diào)用 updateComponent 方法,在此方法中調(diào)用 vm._render 方法先生成虛擬 Node,最終調(diào)用 vm._update 更新 DOM。

    Watcher 在這里起到兩個(gè)作用,一個(gè)是初始化的時(shí)候會(huì)執(zhí)行回調(diào)函數(shù),另一個(gè)是當(dāng) vm 實(shí)例中的監(jiān)測(cè)的數(shù)據(jù)發(fā)生變化的時(shí)候執(zhí)行回調(diào)函數(shù)。

    函數(shù)最后判斷為根節(jié)點(diǎn)的時(shí)候設(shè)置 vm._isMounted 為 true, 表示這個(gè)實(shí)例已經(jīng)掛載了,同時(shí)執(zhí)行 mounted 鉤子函數(shù)。 這里注意 vm.$vnode 表示 Vue 實(shí)例的父虛擬 Node,所以它為 Null 則表示當(dāng)前是根 Vue 的實(shí)例。

    小節(jié)

    mountComponent 方法的邏輯也是非常清晰的,它會(huì)完成整個(gè)渲染工作。

    關(guān)注前端支點(diǎn),更多前端知識(shí)等你探索。

    掃描二維碼推送至手機(jī)訪問。

    版權(quán)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請(qǐng)聯(lián)系。

    本文鏈接:http://www.daniuzhishi.com/?id=44543

    “vue 源碼探索(二)” 的相關(guān)文章

    大比分輸球不可怕,中國青少年足球聯(lián)賽搭建成才舞臺(tái)

    大比分輸球不可怕,中國青少年足球聯(lián)賽搭建成才舞臺(tái)

      近日,第一屆中國青少年足球聯(lián)賽全國總決賽激戰(zhàn)正酣,來自職業(yè)俱樂部梯隊(duì)、校園足球和社會(huì)青訓(xùn)機(jī)構(gòu)、體校等不同主體的代表隊(duì),來到同一個(gè)舞臺(tái)對(duì)決,算是對(duì)中國青訓(xùn)進(jìn)行一次檢閱式練兵。   大比分比賽暴露癥結(jié),發(fā)現(xiàn)并解決問題才是目的   在結(jié)束的一場(chǎng)U13組比賽中,湖北星...

    有哪些關(guān)于足球的冷知識(shí)?

    有哪些關(guān)于足球的冷知識(shí)?

    1.高水平的黑哨 2003年末代甲A,上海申花希望戰(zhàn)勝同城對(duì)手上海國際,從而贏的奪冠的主動(dòng)權(quán)。于是就給了當(dāng)時(shí)的金哨陸俊35萬。但比賽開始后陸俊并沒有對(duì)上海國際隊(duì)進(jìn)行嚴(yán)格的吹罰,反而吹的很寬松,于是國際隊(duì)的動(dòng)作越來越大,直到陸俊對(duì)國際隊(duì)做出了...

    世界杯競(jìng)彩足球推薦2串1 世界杯F組[1] 比利時(shí) VS 摩洛哥

    世界杯競(jìng)彩足球推薦2串1 世界杯F組[1] 比利時(shí) VS 摩洛哥

     “競(jìng)彩足球推薦世界杯卡塔爾籃球推薦二串一如果我只是一名西甲聯(lián)賽球迷,競(jìng)彩足球推薦我會(huì)很喜歡德甲這一場(chǎng)英超的比賽,亞冠但作為法甲籃彩推薦皇馬的意甲教練,我必須C羅考慮球隊(duì)很早就丟了歐洲杯兩個(gè)球?!?  尤文圖斯比賽結(jié)束之后,亞冠內(nèi)馬爾安切洛蒂的梅西這句話實(shí)際上準(zhǔn)確地描述了曼城這場(chǎng)曼...

    英超足球比分起伏不定,6分鐘進(jìn)4球,進(jìn)球大作戰(zhàn)

    英超足球比分起伏不定,6分鐘進(jìn)4球,進(jìn)球大作戰(zhàn)

    北京時(shí)間1月3日凌晨4時(shí),英超聯(lián)賽第21輪,伯恩茅斯主場(chǎng)3-3戰(zhàn)平沃特福德。兩隊(duì)在26分鐘內(nèi)攜手打進(jìn)6球,在新年的首戰(zhàn)中為雙方球迷們貢獻(xiàn)了一場(chǎng)進(jìn)球表演。...

    競(jìng)彩冠軍、冠亞軍競(jìng)猜今日開售

    世界杯倒計(jì)時(shí)100天 新快報(bào)訊 記者陸妍思 通訊員謝明明報(bào)道 告別了2月的冬奧冰雪盛宴,3月體壇馬上進(jìn)入世界杯的節(jié)奏。今天,2018俄羅斯世界杯迎來了“倒計(jì)時(shí)100天”,為了讓廣大球迷和購彩者提前上場(chǎng)感受世界杯的熱烈氛圍,中國體育彩票競(jìng)彩游戲于即日起開售本屆世界杯賽的冠軍競(jìng)猜、冠...

    中國足彩網(wǎng)競(jìng)彩27日推薦:看好德國阻擊西班牙

    中國足彩網(wǎng)競(jìng)彩27日推薦:看好德國阻擊西班牙

      世界杯 西班牙VS德國   比賽時(shí)間:2022-11-28   03:00   球場(chǎng):海灣球場(chǎng)   西班牙男足在去年歐洲杯晉級(jí)四強(qiáng),已經(jīng)宣告實(shí)力回歸,佩德里,加維等小將實(shí)力崛起。本次世界杯,西班牙也是奪冠熱門之一,球隊(duì)低調(diào)出行,值...

    ?