最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

詳解幾十行代碼實(shí)現(xiàn)一個(gè)vue的狀態(tài)管理

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:01:21
文檔

詳解幾十行代碼實(shí)現(xiàn)一個(gè)vue的狀態(tài)管理

詳解幾十行代碼實(shí)現(xiàn)一個(gè)vue的狀態(tài)管理:介紹 采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài), 就能實(shí)現(xiàn)組件間數(shù)據(jù)共享 實(shí)現(xiàn) 邏輯圖 從圖上有兩條線(xiàn): Vue.use(vuec), 與 new Vuec.center(options) 第一條線(xiàn)Vue.use(vuec)安裝插件 使用Vue.use(vuec)時(shí), 會(huì)執(zhí)行vuec的install
推薦度:
導(dǎo)讀詳解幾十行代碼實(shí)現(xiàn)一個(gè)vue的狀態(tài)管理:介紹 采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài), 就能實(shí)現(xiàn)組件間數(shù)據(jù)共享 實(shí)現(xiàn) 邏輯圖 從圖上有兩條線(xiàn): Vue.use(vuec), 與 new Vuec.center(options) 第一條線(xiàn)Vue.use(vuec)安裝插件 使用Vue.use(vuec)時(shí), 會(huì)執(zhí)行vuec的install

介紹

采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài), 就能實(shí)現(xiàn)組件間數(shù)據(jù)共享

實(shí)現(xiàn)

邏輯圖

從圖上有兩條線(xiàn): Vue.use(vuec), 與 new Vuec.center(options)

第一條線(xiàn)Vue.use(vuec)安裝插件

使用Vue.use(vuec)時(shí), 會(huì)執(zhí)行vuec的install方法,會(huì)注入?yún)?shù)Vue 所以vuec是這樣的,

// index.js
import {Center, install} from './center'
export default {Center, install}

Center對(duì)象將實(shí)例化成center(下面再說(shuō)),我們先看看install方法

// center.js
let Vue // 全局變量, 保存install里的Vue
export function install (_Vue) {
 if (!Vue) {
 _Vue.mixin({
 beforeCreate: applyMixin // 在beforeCreate鉤子上混入applyMixin函數(shù)
 })
 }
 Vue = _Vue
}

install在Vue原型的beforeCreate混入applyMixin函數(shù), 也就是說(shuō)在生成每個(gè)Vue組件時(shí),在它的生命周期beforeCreate鉤子上就會(huì)執(zhí)行applyMixin方法

第二條線(xiàn) new Vuec.center(options)實(shí)例化Center對(duì)象

先看看用戶(hù)傳入的options, 下面例子

export default new Vuec.Center({
 state: {
 name: 'liuyang'
 },
 mutations: {
 changeName (state) {
 state.name = 'jike'
 }
 }
})

上面代碼會(huì)生成center實(shí)例, 該實(shí)例上應(yīng)該包括:state狀態(tài),commit方法提交變更等

// center.js
export class Center {
 constructor (options= {}) {
 let center = this
 this.mutations = options.mutations
 observeState(center, options.state)
 }
 get state () { // 代理了this.$center.state的最終訪(fǎng)問(wèn)值
 return this._vm.$data.$$state
 }
 commit (_type, _payload) {
 this.mutations[_type](this.state, _payload)
 }
}
function observeState(center, state) { // 響應(yīng)式state
 center._vm = new Vue({
 data: {
 $$state: state
 }
 })
}

在執(zhí)行new Vuec.Center({..})時(shí),就是執(zhí)行Center的構(gòu)造函數(shù)

首先執(zhí)行l(wèi)et center = this, 定義center保存當(dāng)前實(shí)例

接著執(zhí)行this.mutations = options.mutations, 在實(shí)例center上添加mutations屬性, 值就是用戶(hù)輸入mutations,

按上面例子, this.mutations長(zhǎng)成這樣

this.mutations = {
 changeName (state) {
 state.name = 'jike'
 }
}

最后執(zhí)行observeState(center, options.state), 作用:讓center實(shí)例的state屬性指向options.state并且是響應(yīng)式的

 function observeState(center, state) { // 響應(yīng)式state
 center._vm = new Vue({ // 利用Vue的響應(yīng)系統(tǒng),將state轉(zhuǎn)化成響應(yīng)式
 data: {
 $$state: state
 }
 })
 }

在center實(shí)例上添加_vm屬性, 值是一個(gè)Vue實(shí)例, 在該Vue實(shí)例的data下定義了$$state, 它的值是options.state用戶(hù)輸入的state; 結(jié)合上面的這段代碼

// center.js
export class Center {
 ...省略
 get state () { // 代理了this.$center.state的最終訪(fǎng)問(wèn)值
 return this._vm.$data.$$state
 }
 ...省略
}

所以我們?cè)诮M件中訪(fǎng)問(wèn)center.state其實(shí)就是訪(fǎng)問(wèn)center._vm.$data.$$state

OK, center就構(gòu)建好了

創(chuàng)建Vue組件

用戶(hù)輸入

import Vue from 'vue'
import App from './App'
import router from './router'
import center from './center'

new Vue({
 el: '#app',
 router,
 center, // 構(gòu)建好的center實(shí)例
 template: '<App/>',
 components: {App}
})

在beforeCreate生命周期時(shí)會(huì)觸發(fā)上面混入的applyMixin函數(shù)

// mixins.js
export default function applyMixin() {
 vuecInit.call(this) // 
}

function vuecInit () {
 const options = this.$options
 // vue的實(shí)例化是從外往內(nèi), 所以父組件的$center一定是options的center
 this.$center = options.parent?options.parent.$center: options.center
}

applyMixin里會(huì)執(zhí)行vuecInit.call(this), 這里的this指向當(dāng)前組件的實(shí)例,

接著看vuecInit, 定義了options等于用戶(hù)輸入選項(xiàng),因?yàn)橄葎?chuàng)建根組件, 所以根組件this.$center的值的引用就是我們?cè)趎ew Vue({..center})時(shí)傳入的center實(shí)例, 下面所有組件都指向它

OK, 你就可以在組件里使用this.$center訪(fǎng)問(wèn)了

commit變更

// center.js
export class Center {
 ... 省略
 commit (_type, _payload) {
 this.mutations[_type](this.state, _payload)
 }
}

通常我們變更時(shí): this.$center.commit('changeName', 'jike'), 這樣的話(huà), this.mutations[_type]就是對(duì)應(yīng)方法函數(shù), 往該函數(shù)里傳入state以及payload,

舉上面的例子

// this.mutations[_type] , _type = 'changeName', payload= 'jike'
this.mutations = {
 changeName (state, payload) {
 state.name = payload
 }
}

說(shuō)明

上面只是一個(gè)簡(jiǎn)單的狀態(tài)管理, 還有很多地方?jīng)]有實(shí)現(xiàn): actions異步變更,getters函數(shù),modules模塊分割, 輔助函數(shù)mapState..等

源碼地址: github

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

詳解幾十行代碼實(shí)現(xiàn)一個(gè)vue的狀態(tài)管理

詳解幾十行代碼實(shí)現(xiàn)一個(gè)vue的狀態(tài)管理:介紹 采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài), 就能實(shí)現(xiàn)組件間數(shù)據(jù)共享 實(shí)現(xiàn) 邏輯圖 從圖上有兩條線(xiàn): Vue.use(vuec), 與 new Vuec.center(options) 第一條線(xiàn)Vue.use(vuec)安裝插件 使用Vue.use(vuec)時(shí), 會(huì)執(zhí)行vuec的install
推薦度:
標(biāo)簽: VUE 狀態(tài) 管理
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專(zhuān)題
Top