摘要:首先在里調(diào)用函數(shù)把獲取相應(yīng)傳遞過去里在原型上定義方法對瀏覽器的怪癖做兼容布爾值。對瀏覽器的怪癖做兼容布爾值。
首先在init.js里調(diào)用$mount函數(shù)
把el #app獲取相應(yīng)dom傳遞過去
Vue.prototype._init = function (options) { ... if (vm.$options.el) { vm.$mount(vm.$options.el) } }
entry-runtime-with-compiler.js里在Vue原型上定義$mount方法
Vue.prototype.$mount = function ( el, hydrating ) { let template = options.template template = idToTemplate(template) const { render, staticRenderFns } = compileToFunctions(template , { shouldDecodeNewlines, // 對瀏覽器的怪癖做兼容,布爾值。 shouldDecodeNewlinesForHref, // 對瀏覽器的怪癖做兼容,布爾值。 delimiters: options.delimiters, //vue透傳 comments: options.comments //vue透傳 }, this) }
template(64)和 render(72), staticRenderFns(73) 對應(yīng)圖中所示
render是渲染函數(shù),staticrenderfns是靜態(tài)樹的渲染函數(shù)
//render function anonymous( ) { with(this){return _c("div",[_c("h1",{staticStyle:{"color":"red"}},[_v("我是選項模板3")]),_v(" "),_c("p",[_v(_s(number))]),_v(" "),_c("p",[_v(_s(message))]),_v(" "),_m(0)])} } //staticrenderfns 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")])])} }
//template我是選項模板3
{{number}}
{{message}}
111122345
children多的放進了staticrenderfns 其余的放進了render 至于為什么這么做,傳送門
從ast到render過程
compileToFunctions來源
platform文件下 compiler文件 index.js文件
const { compile, compileToFunctions } = createCompiler(baseOptions)
createCompiler來源
core文件下 compiler文件 index.js文件
export const createCompiler = createCompilerCreator(function baseCompile ( template, options ) { // 使用 parse 函數(shù)將模板解析為 AST const ast = parse(template.trim(), options) // ast對象進行優(yōu)化,找出ast對象中所有靜態(tài)子樹 if (options.optimize !== false) { optimize(ast, options) } // 根據(jù)給定的AST生成最終的目標平臺的代碼 const code = generate(ast, options) return { ast, render: code.render, staticRenderFns: code.staticRenderFns } })
createCompilerCreator來源
creact-compiler.js下
export function createCompilerCreator (baseCompile) { return function createCompiler (baseOptions) { function compile ( template, options ) { const finalOptions = Object.create(baseOptions) // 執(zhí)行createCompilerCreator里傳來的函數(shù) 生生ast等 const compiled = baseCompile(template, finalOptions) compiled.errors = errors compiled.tips = tips return compiled } return { compile, compileToFunctions: createCompileToFunctionFn(compile) } } }
compiled如下即
return { ast, render: code.render, staticRenderFns: code.staticRenderFns } compiled.errors = errors compiled.tips = tips
總之,在$mount原型函數(shù)里面$mount
給 vue.options 掛載了 render和staticRenderFns
options.render = render
options.staticRenderFns = staticRenderFns
打印 options
掛在后需要渲染
lifecycle.js
mountComponent(){ callHook(vm, "beforeMount") updateComponent = () => { vm._update(vm._render(), hydrating) } // 把更新組件加入依賴 new Watcher(vm, updateComponent, noop, { before () { if (vm._isMounted) { callHook(vm, "beforeUpdate") } } }, true /* isRenderWatcher */) }
vm._render()生成傳說中的VNode,即虛擬dom
vm._render()執(zhí)行函數(shù)結(jié)果
vm._update方法的實現(xiàn)
Vue.prototype._update = function (vnode, hydrating) { // 判斷vnode是否初始化過 if (!prevVnode) { // initial render vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */) } else { // updates vm.$el = vm.__patch__(prevVnode, vnode) } }
通過__patch__更新
在 platform/web/runtime/index.js文件里執(zhí)行了mountComponent方法
import { mountComponent } from "core/instance/lifecycle" Vue.prototype.$mount = function ( el, hydrating ) { el = el && inBrowser ? query(el) : undefined // 調(diào)用mountComponent方法 return mountComponent(this, el, hydrating) }
最終效果圖
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97347.html
摘要:圖在中應(yīng)用三數(shù)據(jù)渲染過程數(shù)據(jù)綁定實現(xiàn)邏輯本節(jié)正式分析從到數(shù)據(jù)渲染到頁面的過程,在中定義了一個的構(gòu)造函數(shù)。一、概述 vue已是目前國內(nèi)前端web端三分天下之一,也是工作中主要技術(shù)棧之一。在日常使用中知其然也好奇著所以然,因此嘗試閱讀vue源碼并進行總結(jié)。本文旨在梳理初始化頁面時data中的數(shù)據(jù)是如何渲染到頁面上的。本文將帶著這個疑問一點點追究vue的思路。總體來說vue模版渲染大致流程如圖1所...
摘要:接下來我們分析下是如何調(diào)用的,這就涉及到了經(jīng)典的機制此處先簡單介紹,下一篇會有較詳細的分析。 Vue demo 先給出vue簡單的使用demo,通過創(chuàng)建一個Vue的實例,將被替換成template模版中的內(nèi)容,a,b的值也會被換成data屬性的值 var vm = new Vue({ el: #app, template: ` {{a}} {} ...
摘要:通過對源碼閱讀,想寫一寫自己的理解,能力有限故從尤大佬第一次提交開始讀,準備陸續(xù)寫模版字符串轉(zhuǎn)語法樹語法樹轉(zhuǎn)函數(shù)雙向綁定原理虛擬比較原理其中包含自己的理解和源碼的分析,盡量通俗易懂由于是的最早提交,所以和最新版本有很多差異,后續(xù)將陸續(xù)補充, 通過對 Vue2.0 源碼閱讀,想寫一寫自己的理解,能力有限故從尤大佬2016.4.11第一次提交開始讀,準備陸續(xù)寫: 模版字符串轉(zhuǎn)AST語法...
摘要:通過對源碼閱讀,想寫一寫自己的理解,能力有限故從尤大佬第一次提交開始讀,準備陸續(xù)寫模版字符串轉(zhuǎn)語法樹語法樹轉(zhuǎn)函數(shù)雙向綁定原理虛擬比較原理其中包含自己的理解和源碼的分析,盡量通俗易懂由于是的最早提交,所以和最新版本有很多差異,后續(xù)將陸續(xù)補充, 通過對 Vue2.0 源碼閱讀,想寫一寫自己的理解,能力有限故從尤大佬2016.4.11第一次提交開始讀,準備陸續(xù)寫: 模版字符串轉(zhuǎn)AST語法...
閱讀 1181·2023-04-26 02:42
閱讀 1633·2021-11-12 10:36
閱讀 1780·2021-10-25 09:47
閱讀 1262·2021-08-18 10:22
閱讀 1801·2019-08-30 15:52
閱讀 1213·2019-08-30 10:54
閱讀 2635·2019-08-29 18:46
閱讀 3496·2019-08-26 18:27