Vue源碼學(xué)習(xí)之?dāng)?shù)據(jù)初始化
初始化數(shù)據(jù)
環(huán)境搭建:菜鳥學(xué)Vue源碼第一步之rollup環(huán)境搭建步
響應(yīng)式數(shù)據(jù)的核心就是,數(shù)據(jù)變化了可以監(jiān)聽到數(shù)據(jù)變化了,數(shù)據(jù)的取值和更改值可以監(jiān)測(cè)到,首先第一步需要?jiǎng)?chuàng)建一個(gè)Vue實(shí)例
創(chuàng)建Vue實(shí)例
//dist/index.html
//用Vue創(chuàng)造一個(gè)實(shí)例
const vm = new Vue({
data(){
return {
name:'i東東',
age:18
}
}
})
創(chuàng)造完 Vue實(shí)例,緊接著就需要有一個(gè)類去代理data中的數(shù)據(jù),但是在Vue中并沒有直接去用class去構(gòu)建一個(gè)類,因?yàn)檫@樣寫會(huì)將所有的方法都耦合在一起(類的特點(diǎn)),所以Vue本身采用了一個(gè)構(gòu)造函數(shù),通過構(gòu)造函數(shù)去擴(kuò)展方法。
構(gòu)造函數(shù)擴(kuò)展方法
//src/index.js
import { initMixin } from "./init";
function Vue(options){
this._init(options)
}
initMixin(Vue) // 擴(kuò)展了init方法 (后面會(huì)寫)
export default Vue
在拿到options選項(xiàng)之后需要做一個(gè)初始化,就需要加一個(gè)方法來用于初始化。但是如果功能一多,就很比較亂,所以就需要把它拆成兩個(gè)文件
export function initMixin(Vue) { //給Vue增加init方法
Vue.prototype._init = function (options) { //用來初始化數(shù)據(jù) }
}
這樣就可以直接在index.js中調(diào)用initMixin方法,這種方法,就可以把這些原型方法擴(kuò)展成一個(gè)個(gè)函數(shù),通過函數(shù)的方式在圓形上去擴(kuò)展功能。
在用的時(shí)候就可以在當(dāng)前實(shí)例上擴(kuò)展一些屬性,比如Vue中的vm.$optios,就是用來獲取用戶配置的,緊接著就需要進(jìn)行初始化狀態(tài)
初始化狀態(tài)
//src/init.js
import { initState } from "./state"
export function initMixin(Vue) { //給Vue增加init方法
Vue.prototype._init = function (options) { //用來初始化數(shù)據(jù)
// 所有以$開頭的都會(huì)被認(rèn)為是Vue的屬性,比如$nextTick()
const vm = this
vm.$options = options // 將用戶的屬性掛載到實(shí)例上
// 初始化狀態(tài)(props,methods,data等進(jìn)行處理)原型中的this值得都是實(shí)例
initState(vm)
}
}
initState方法可以將它進(jìn)行拆分到一個(gè)新的文件中,通過initState方法對(duì)數(shù)據(jù)進(jìn)行劫持,判斷數(shù)據(jù)是否存在,然后調(diào)用initData方法對(duì)數(shù)據(jù)進(jìn)行代理
調(diào)用initData方法對(duì)數(shù)據(jù)進(jìn)行代理
//
/src/state.js
export function initState(vm){
// 對(duì)數(shù)據(jù)需要進(jìn)行劫持
const opts = vm.$options //獲取所有選項(xiàng)
if (opts.data){
initData(vm)
}
}
function initData(vm){
// 對(duì)數(shù)據(jù)進(jìn)行代理
let data = vm.$options.data
// data可以是函數(shù)或者對(duì)象,根實(shí)例可以是對(duì)象,組件data必須勢(shì)函數(shù)
data = typeof data === 'function' ? data.call(vm) : data
console.log(data); // {name: 'i東東', age: 18}
}
執(zhí)行index.html 當(dāng)控制臺(tái)輸出{name: 'i東東', age: 18}就表示初始化數(shù)據(jù)完成
以上就是Vue源碼學(xué)習(xí)之?dāng)?shù)據(jù)初始化的詳細(xì)內(nèi)容,更多關(guān)于Vue 數(shù)據(jù)初始化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue.js每天必學(xué)之?dāng)?shù)據(jù)雙向綁定
Vue.js每天必學(xué)之?dāng)?shù)據(jù)雙向綁定,如何進(jìn)行綁定,如何進(jìn)行數(shù)據(jù)雙向綁定,感興趣的小伙伴們可以參考一下2016-09-09
vue單應(yīng)用在ios系統(tǒng)中實(shí)現(xiàn)微信分享功能操作
這篇文章主要介紹了vue單應(yīng)用在ios系統(tǒng)中實(shí)現(xiàn)微信分享功能操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
使用watch監(jiān)聽路由變化和watch監(jiān)聽對(duì)象的實(shí)例
下面小編就為大家分享一篇使用watch監(jiān)聽路由變化和watch監(jiān)聽對(duì)象的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
Vue的子組件props如何設(shè)置多個(gè)校驗(yàn)類型
這篇文章主要介紹了Vue的子組件props如何設(shè)置多個(gè)校驗(yàn)類型問題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
VUE3基于vite封裝條形碼和二維碼組件的詳細(xì)過程
基礎(chǔ)組件開發(fā)是項(xiàng)目業(yè)務(wù)開發(fā)的基石, 本文主要介紹了通過vue3的vite腳手架快速搭建項(xiàng)目, 開發(fā)條形碼和二維碼組件的過程,感興趣的朋友跟隨小編一起看看吧2023-08-08
uni-app無限級(jí)樹形組件簡(jiǎn)單實(shí)現(xiàn)代碼
文章介紹了如何在uni-app中簡(jiǎn)單封裝一個(gè)無限級(jí)樹形組件,該組件可以無線嵌套,展開和收縮,并獲取子節(jié)點(diǎn)數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01
Vue學(xué)習(xí)筆記進(jìn)階篇之多元素及多組件過渡
本篇文章主要介紹了Vue學(xué)習(xí)筆記進(jìn)階篇之多元素及多組件過渡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
利用Vue實(shí)現(xiàn)一個(gè)markdown編輯器實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于如何利用Vue實(shí)現(xiàn)一個(gè)markdown編輯器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

