用console.log解讀Vue源碼

前言

本文通過(guò)console.log的一些特性,結(jié)合vue.js的源碼,通過(guò)一個(gè)簡(jiǎn)單的例子,讓你了解Vue的各個(gè)過(guò)程的變化.</br>
<strong>控制臺(tái)輸出的效果圖</strong>

image
image

請(qǐng)用chrome查看,并打開(kāi)控制臺(tái)看效果
演示地址

準(zhǔn)備

vue-console.html的創(chuàng)建

下載vue.js文件,在vue-console.html中引入,我寫(xiě)了一個(gè)簡(jiǎn)單的例子,涵蓋:初始化視圖->點(diǎn)擊后更新視圖(包括各個(gè)鉤子函數(shù))</br>
代碼如下:

  <script src="./vue.js"></script>
  <div id="app">
    <div id="hi" @click="changeName">{{name}}</div>
  </div>
  </div>
    <script>
    var style = 'font-size: 20px;color: blue'
    var vm = new Vue({
      el:'#app',
      data() {
        return {
          name: '點(diǎn)我',
        }
      },
      beforeCreate () {
        console.log('%cI am beforeCreate------ 我在選項(xiàng)里寫(xiě)的', style)
      },
      created () {
        console.log('%cI am created------ 我在選項(xiàng)里寫(xiě)的', style)
      },
      beforeMount () {
        console.log('%cI am beforeMount------ 我在選項(xiàng)里寫(xiě)的', style)
      },
      mounted () {
        console.log('%cI am mounted------ 我在選項(xiàng)里寫(xiě)的', style)
      },
      beforeUpdate () {
        console.log('%cI am beforeUpdate------ 我在選項(xiàng)里寫(xiě)的',style)
      },
      updated () {
        console.log('%cI am updated------ 我在選項(xiàng)里寫(xiě)的', style)
      },
      methods: {
        changeName () {   // 點(diǎn)擊是文本發(fā)生變化
          this.name = 'jike'
        } 
      }
    })  
  </script>

console.log樣式的配置


var tagLeftStyle = [
  'color: #fff',
  'border-top-left-radius:3px',
  'border-bottom-left-radius:3px',
  'background-color: #564b4f',
  'padding: 5px'
].join(';')

var tagRightStyle = function (color) {
  color = color?color:'#0BCF1B'
  return [
    'color: #fff',
    'border-top-right-radius:3px',
    'border-bottom-right-radius:3px',
    `background-color: ${color}`,
    'padding: 5px'
  ].join(';')
}
// ...
// 一些樣式省略,具體可以去看源碼
var tagVariable = function (obj, tag, desc, num, detail, color) {
  console.log(`%c${lineNo} %o%c<---%c${tag}%c${desc}  %c源碼${num}行 %c說(shuō)明: %o`, noStyle, obj, arrowStyle ,tagLeftStyle, tagRightStyle(color), sourceNoStyle, detailStyle, detail)
  lineNo++
}
// %c代表后面的文本,使用css樣式,%o代表對(duì)象輸出

image

上面的代碼只要調(diào)用tagVariable(...)傳遞參數(shù),就實(shí)現(xiàn)上圖?的標(biāo)簽效果,
還可以console.log顯示圖片,加了一下講解圖方便理解;

image

通過(guò)調(diào)用上面封裝的函數(shù)在vue.js某些時(shí)刻調(diào)用,就達(dá)到很好的效果

項(xiàng)目過(guò)程

我將整個(gè)過(guò)程分為四個(gè)階段: 構(gòu)造函數(shù)階段肠牲、初始化階段拍嵌、掛載階段更新階段,
會(huì)以上面提到的例子貫穿的

構(gòu)造函數(shù)階段

平常我們使用Vue,都是用new Vue({}),其實(shí)就是調(diào)用它的構(gòu)造函數(shù)創(chuàng)建實(shí)例,如下圖

image

初始化階段

會(huì)對(duì)我們傳入data摘符、methods等處理,便于后面階段的調(diào)用及一些功能的實(shí)現(xiàn)
如例子的dataname會(huì)被代理到vm實(shí)例上,所以我們可以用this.name調(diào)用

data() {
  return {
    name: '點(diǎn)我',
  }
}
image

掛載階段

<div id="app">
  <div id="hi" @click="changeName">{{name}}</div>
</div>

會(huì)將上面的html渲染成視圖(這里面包括渲染函數(shù),虛擬dom的實(shí)現(xiàn)等)

image

更新階段

點(diǎn)擊頁(yè)面上的文本時(shí)發(fā)生更新,這個(gè)過(guò)程包括:wathcer的觸發(fā)、patch算法對(duì)比新舊vnode,更新dom

image

說(shuō)明

具體的可以去看源碼,在github上,覺(jué)得可以的話幫忙star一下

參考文章: Vue技術(shù)內(nèi)幕
Vue.js 源碼解析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末策吠,一起剝皮案震驚了整個(gè)濱河市逛裤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猴抹,老刑警劉巖带族,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蟀给,居然都是意外死亡蝙砌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)跋理,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)择克,“玉大人,你說(shuō)我怎么就攤上這事前普§艚龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵汁政,是天一觀的道長(zhǎng)道偷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)记劈,這世上最難降的妖魔是什么勺鸦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮目木,結(jié)果婚禮上换途,老公的妹妹穿的比我還像新娘。我一直安慰自己刽射,他們只是感情好军拟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著誓禁,像睡著了一般懈息。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摹恰,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天辫继,我揣著相機(jī)與錄音怒见,去河邊找鬼。 笑死姑宽,一個(gè)胖子當(dāng)著我的面吹牛遣耍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炮车,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼舵变,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瘦穆?” 一聲冷哼從身側(cè)響起棋傍,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎难审,沒(méi)想到半個(gè)月后瘫拣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡告喊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年麸拄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黔姜。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拢切,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秆吵,到底是詐尸還是另有隱情淮椰,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布纳寂,位于F島的核電站主穗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毙芜。R本人自食惡果不足惜忽媒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腋粥。 院中可真熱鬧晦雨,春花似錦、人聲如沸隘冲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)展辞。三九已至奥邮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纵竖,已是汗流浹背漠烧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靡砌,地道東北人已脓。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像通殃,于是被迫代替她去往敵國(guó)和親度液。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 物有本末画舌,事有終始堕担,知所先后,則近道矣 ---《大學(xué)》 在分析Vue初始化之前曲聂,我們先看看Vue源碼的目錄結(jié)構(gòu):...
    海洋之木閱讀 8,073評(píng)論 13 46
  • 一:什么是閉包霹购?閉包的用處? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)朋腋。在本質(zhì)上齐疙,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 9,635評(píng)論 1 52
  • 喜歡一個(gè)人贞奋,愿意為其做任何事,因?yàn)樾睦镉兴?不喜歡一個(gè)人穷绵,他無(wú)論做什么轿塔,你也沒(méi)往心里去,最多一張好人卡仲墨! 喜歡 ...
    7c93d9d1ab0e閱讀 307評(píng)論 0 0
  • 小時(shí)候目养,我的家在老城的四合院里漫拭。那時(shí)候歲月從容,父母還正青春混稽。 我們的院子很大采驻,前院后院各有一棵需要兩三人才能合圍...
    云兒520閱讀 334評(píng)論 1 5
  • 企鵝跳一下閱讀 194評(píng)論 0 0