2. vue的初始化流程

timg.jpg

本篇文章主要講解 Vue 時 發(fā)生了什么 箭阶?

我們需要在 index.html 文件 ,先按照vue的書寫方式:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./dist/umd/vue.js"></script>
<body>
    <h3>測試</h3>
    <div id="app"></div>
    <script>
        new Vue({
            el: "#app",
            data() {
                return {
                    a: 101
                }
            }
        })
    </script>
</body>
</html>

這個大家應(yīng)該很熟悉了 氏仗,我們用vue 的時候都有這個文件矫夷,Vue 的實(shí)例化對象。

既然這里都 new Vue 對象了 霹陡, 那我們肯定的有一個 Vue 類了 和蚪。
我們在 src/index.js 文件里 寫個類。

// export const fn = () => {}

function Vue(options) {
    // 入庫方法 初始化操作
    this._init(options)
}

Vue.prototype._init = function(options) {}

export default Vue

寫到這里可能有的人會問 烹棉,既然寫類文件 為什么不用 class 呢 攒霹?
我寫段代碼大家看下 就明白了。

class Vue{
    fn1() {
        
    }
    fn2() {
        
    }
    fn3() {
        
    }
    fn4() {
        
    }
    fn5() {
        
    }
    fn6() {
        
    }
    ......
}

這樣的話 可能就如上面所示了 浆洗,我們的把很多方法 或者屬性 都添加寫到這個類文件中.

總結(jié)一句話: 使用構(gòu)造函數(shù)的方式 就是為了解耦 方便擴(kuò)展 催束。

接下來 我們只需要把方法,寫成一個個小的插件的形式 掛載到原型上就可以了伏社。

-新建 src/init.js 文件 抠刺,把_init() 初始化方法單獨(dú)在這里操作

export function initMixin(Vue) {
    Vue.prototype._init = function(options) {
        console.log(options, '測試123')
    }
}

接著把該文件引入到 Vue類文件中去

// export const fn = () => {}  // 這是之前的測試,可刪除
import { initMixin } from './init'
function Vue(options) {
    // 入庫方法 初始化操作
    this._init(options)
}

initMixin(Vue)   // 寫成插件摘昌,方便解耦

export default Vue

這是我們可以先編譯看下:

npm run dev

這里我們就應(yīng)經(jīng)打印出 Vue傳過來的對象了 速妖。

這是我們需要把之前的代碼稍微改造下
首先 index.html 文件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./dist/umd/vue.js"></script>

<body>
    <h3>測試</h3>
    <div id="app"></div>
    <script>
        let vm = new Vue({
            el: "#app",
            data() {
                return {
                    a: 101
                }
            }
        })
        console.log(vm.$options); // 接收返回 vue 的實(shí)例
    </script>
</body>
</html>

然后init.js文件

export function initMixin(Vue) {
    Vue.prototype._init = function(options) {
        // console.log(options, '測試123')
        const vm = this
        vm.$options = options
    }
}

這里我們同樣可以打印出 。

最后我們把用戶傳過來的狀態(tài)單獨(dú)建個文件 src/initState.js

export function initState(vm) {
    console.log(vm, '測試vm')
}

init.js 文件調(diào)用下

import { initState } from './initState'

export function initMixin(Vue) {
    Vue.prototype._init = function(options) {
        // console.log(options, '測試123')
        const vm = this
        vm.$options = options
        initState(vm) // 初始化狀態(tài) 單獨(dú)建個狀態(tài)文件 initState.js
    }
}

沒問題 聪黎,這里我們也接收到了罕容。
這是我們就可以根據(jù)傳過來的不同選項(xiàng) , 做不同的初始化操作稿饰。

初始化狀態(tài)

export function initState(vm) {
    console.log(vm, '測試vm')
    const opts = vm.$options
    if (opts.props) {
        initProps(vm) // 初始化屬性
    }
    if (opts.methods) {
        initMethods(vm) // 初始化方法
    }
    if (opts.data) {
        initData(vm) // 初始化數(shù)據(jù)
    }
    if (opts.computed) {
        initComputed(vm) // 初始化計算屬性
    }
    if (opts.watch) {
        initWatch(vm)
    }
}

function initProps(vm) {}
function methods(vm) {}
function initData(vm) {
    // 數(shù)據(jù)初始化
    let data = vm.$options.data
    console.log(data)
}
function computed(vm) {}
function initWatch(vm) {}


這是我們數(shù)據(jù)也打印出來了锦秒。

下一篇: 2. Vue的數(shù)據(jù)攔截(對象) , 更多請關(guān)注:2020 - Vue 源碼解析與實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者喉镰。
  • 序言:七十年代末旅择,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侣姆,更是在濱河造成了極大的恐慌生真,老刑警劉巖脖咐,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汇歹,居然都是意外死亡屁擅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門产弹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來派歌,“玉大人,你說我怎么就攤上這事痰哨〗汗” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵斤斧,是天一觀的道長早抠。 經(jīng)常有香客問我,道長撬讽,這世上最難降的妖魔是什么蕊连? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮游昼,結(jié)果婚禮上甘苍,老公的妹妹穿的比我還像新娘。我一直安慰自己烘豌,他們只是感情好载庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廊佩,像睡著了一般囚聚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上标锄,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天顽铸,我揣著相機(jī)與錄音,去河邊找鬼鸯绿。 笑死跋破,一個胖子當(dāng)著我的面吹牛簸淀,可吹牛的內(nèi)容都是我干的瓶蝴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼租幕,長吁一口氣:“原來是場噩夢啊……” “哼舷手!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起劲绪,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤男窟,失蹤者是張志新(化名)和其女友劉穎盆赤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歉眷,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牺六,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了汗捡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淑际。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扇住,靈堂內(nèi)的尸體忽然破棺而出春缕,到底是詐尸還是另有隱情,我是刑警寧澤艘蹋,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布锄贼,位于F島的核電站,受9級特大地震影響女阀,放射性物質(zhì)發(fā)生泄漏宅荤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一浸策、第九天 我趴在偏房一處隱蔽的房頂上張望膘侮。 院中可真熱鬧,春花似錦的榛、人聲如沸琼了。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雕薪。三九已至,卻和暖如春晓淀,著一層夾襖步出監(jiān)牢的瞬間所袁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工凶掰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留燥爷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓懦窘,卻偏偏與公主長得像前翎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子畅涂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355