å¨é 读Vuexæºç ä¹åï¼å 为Vuexçapiå使ç¨åè½ç¥å¾®å¤æï¼é»è®¤ä»¥ä¸ºå®ç°èµ·æ¥ç¸å½å¤æï¼æèççãç¶èéè¿æ·±å ¥å¦ä¹ æºç ï¼åç°æ ¸å¿åè½ç»åvueå®ç°èµ·æ¥é常巧å¦ï¼ä¹å°±æ ¸å¿å è¡ä»£ç ï¼ç´å¼å è¡ãæ¬æä¹å°±100å·¦å³è¡ä»£ç å°±è½å¿«éæåèªå·±çVuex代ç ï¼
åè¨
Vuex æ¯â¼ä¸ªä¸ä¸º Vue.jsåºâ½¤ç¨åºå¼åçç¶æç®¡çæ¨¡å¼ãå®é⽤éä¸å¼åå¨ç®¡çåºâ½¤çææç»ä»¶çç¶æï¼å¹¶ä»¥ç¸åºçè§åä¿è¯ç¶æä»¥â¼ç§å¯é¢æµçâ½ å¼åâ½£ååãé£ä¹Vuexåå纯çå ¨å±å¯¹è±¡æä»ä¹ä¸åå¢ï¼
Vuex çç¶æå卿¯ååºå¼çãå½ Vue ç»ä»¶ä» store ä¸è¯»åç¶æçæ¶åï¼è¥ store ä¸çç¶æåâ½£å åï¼é£ä¹ç¸åºçç»ä»¶ä¹ä¼ç¸åºå°å¾å°â¾¼ææ´æ°ãä¸è½ç´æ¥æ¹å store ä¸çç¶æãæ¹å store ä¸çç¶æçå¯â¼éå¾å°±æ¯æ¾å¼å°æäº¤ (commit) mutationãè¿æ ·ä½¿å¾æä»¬å¯ä»¥â½ 便å°è·è¸ªæ¯â¼ä¸ªç¶æçååï¼ä»â½½è®©æä»¬è½å¤å®ç°â¼äºâ¼¯å ·å¸®å©æ 们æ´å¥½å°äºè§£æä»¬çåºâ½¤ã
éè¿ä»¥ä¸ä¸¤ç¹è®¤ç¥æä»¬æ¥å¿«éå®ç°èªå·±çVuexï¼
Vuex åå§å
为ä»ä¹å¨vueå®ä¾åçæ¶åè¦ä¼ å
¥storeå»å®ä¾åå¢ï¼é£æ¯ä¸ºäºè®©vueææçç»ä»¶ä¸å¯ä»¥éè¿ this.$storeæ¥è·å该对象ï¼å³ this.$store æå store å®ä¾ã
// Store å¾
å®ç°const store = new Store({ state: { count: 0, num: 10})new Vue({ el: '#app', store: store // æ¤å¤ç store 为 this.$options.store})
Vuexæä¾äºinstall屿§ï¼éè¿Vue.use(Vuex)æ¥æ³¨åã
const install = function (Vue) {
Vue.mixin({
beforeCreate() { if (this.$options.store) {
Vue.prototype.$store = this.$options.store
}
}
})
}
Vueå
¨å±æ··â¼äºâ¼ä¸ª beforeCreated é©â¼¦å½æ°ï¼ options.store ä¿å卿æç»ä»¶ç this.$store ä¸ï¼è¿ä¸ª options.store å°±æ¯æä»¬å¨å®ä¾å Store 对象çå®ä¾ãStore 对象çæé 彿°æ¥æ¶â¼ä¸ªå¯¹è±¡åæ°ï¼å®å
å« actions ã getters ã state ã mutations çæ ¸â¼¼æ¦å¿µï¼æ¥ä¸æ¥æä»¬ä¸ä¸å®ç°ã
Vuex state
å ¶å® state æ¯ vue å®ä¾ä¸ç data ï¼éè¿ Store å é¨å建Vueå®ä¾ï¼å° state åå¨å° data éï¼ç¶åæ¹å state å°±æ¯è§¦åäº data æ°æ®çæ¹åä»èå®ç°äºè§å¾çæ´æ°ã
// å®ä¾å Storeconst store = new Store({ state: { count: 0, num: 10
}
})// Store å®ç°class Store { constructor({state = {}}) { this.vm = new Vue({ data: {state} // state æ·»å å° data ä¸
})
} get state() { return this.vm.state // å° state代çå° vue å®ä¾ä¸ç state
} set state(v) { console.warn(`Use store.replaceState() to explicit replace store state.`)
}
}
ç±ä¸å¯ç¥ï¼store.state.count çä»·äº store.vm.stateãä¸è®ºæ¯è·åæè
æ¹åstateéé¢çæ°æ®é½æ¯é´æ¥ç触åäºvueä¸dataæ°æ®çååï¼ä»è触åè§å¾æ´æ°ã
Vuex getters
ç¥éstate æ¯vueå®ä¾ä¸çdataï¼é£ä¹åçï¼getters å°±æ¯ vueä¸ç计ç®å±æ§ computedã
// å®ä¾å Storeconst store = new Store({ state: { count: 0, num: 10
}, getters: { total: state => { return state.num + state.count
}
},
})// Store å®ç°class Store { constructor({state = {}, getters = {}}) { this.getters = getters // å建模æ computed 对象
const computed = {} Object.keys(getters).forEach(key => { const fn = getters[key] // å
¥å state å getters
computed[key] = () => fn(this.state, this.getters) // 代ç getters å° vm å®ä¾ä¸
Object.defineProperty(this.getters, key, { get: () => this.vm[key]
})
}) // èµå¼å° vue ä¸ç computed 计ç®å±æ§ä¸
this.vm = new Vue({ data: {
state,
},
computed,
})
} get state() { return this.vm.state
} set state(v) { console.warn(`Use store.replaceState() to explicit replace store state.`)
}
}
ä½¿ç¨ Object.defineProperty å°gettersä¸çææå±æ§é½ä»£çå°äºvmå®ä¾ä¸çcomputed计ç®å±æ§ä¸ï¼ä¹å°±æ¯ store.getters.count çä»·äº store.vm.countã
Vuex mutations
mutationsçåäºåå¸è®¢é 模å¼ï¼å å¨mutationsä¸è®¢é äºä»¶ï¼ç¶ååcommitåå¸äºä»¶ã
// å®ä¾å Storeconst store = new Store({ state: { count: 0, num: 10
}, mutations: { INCREASE: (state, n) =>{
state.count += n
}, DECREASE: (state, n) =>{
state.count -= n
}
}
})// Store å®ç°class Store { constructor({state = {}, mutations = {}, strict = false}) { this.mutations = mutations // ä¸¥æ ¼æ¸ç´¢åªè½éè¿ commit æ¹å state
this.strict && this.enableStrictMode()
}
commit(key, payload) { // è·åäºä»¶
const fn = this.mutations[key] // å¼å§ commit
this.committing = true
// æ§è¡äºä»¶ å¹¶ä¼ å
fn(this.state, payload)
// ç»æ commit æä»¥è¯´æ commit åªè½æ§è¡åæ¥äºä»¶
this.committing = false
}
enableStrictMode () { // vmå®ä¾è§å¯ state æ¯å¦ç± commit è§¦åæ¹å
this.vm.$watch('state', () => {
!this.committing
&&
console.warn(`Do not mutate vuex store state outside mutation handlers.`)
}, { deep: true, sync: true })
}
get state() { return this.vm.state
} set state(v) { console.warn(`Use store.replaceState() to explicit replace store state.`)
}
}
store.commit æ§è¡ mutationsä¸çäºä»¶ï¼éè¿åå¸è®¢é
å®ç°èµ·æ¥å¹¶ä¸é¾ã Vuexä¸çä¸¥æ ¼æ¨¡å¼ï¼åªè½å¨commitçæ¶åæ¹åstateæ°æ®ï¼ä¸ç¶æç¤ºé误ã
Vuex actions
mutations ç¨äºåæ¥æ´æ° stateï¼è actions 忝æäº¤ mutationsï¼å¹¶å¯è¿è¡å¼æ¥æä½ï¼ä»èé´æ¥æ´æ° stateã
// å®ä¾å Storeconst store = new Store({ actions: {
getToal({dispatch, commit, state, getters}, n){ return new Promise(resolve => {
setTimeout(() => {
commit('DECREASE', n)
resolve(getters.total)
}, 1000)
})
}
}
})// Store å®ç°class Store { constructor({actions = {}}) { this.actions = actions
}
dispatch(key, payload) { const fn = this.actions[key] const {state, getters, commit, dispatch} = this
// 注æ this æå
const result = fn({state, getters, commit: commit.bind(this), dispatch: dispatch.bind(this)}, payload) // è¿å promise
return this.isPromise(result) ? result : Promise.resolve(result)
}
// 夿æ¯å¦æ¯ promise
isPromise (val) { return val && typeof val.then === 'function'
}
}
mutations å actions çå®ç°å¤§åå°å¼ï¼actions æ ¸å¿å¨äºå¤ç弿¥é»è¾ï¼å¹¶è¿åä¸ä¸ª promiseã
宿´æ¡ä¾ä»£ç
è¿è¾¹æä»¥ä¸ç代ç ç»ä¸å½çº³èµ·æ¥ï¼å¯ä»¥æ ¹æ®è¿ä»½å®æ´ä»£ç æ¥åæVuexé»è¾ã
Document
æ»ç»
éè¿ä¸é¢ç宿´æ¡ä¾å¯ç¥,Vuexæ ¸å¿ä»£ç ä¹å°±100è¡å·¦å³ï¼ä½æ¯ä»å·§å¦çç»åäºvueçdataåcomputeds屿§ï¼åç¹ä¸ºç®ï¼å®ç°äºå¤æçåè½ï¼æä»¥è¯´vuexæ¯ä¸è½è±ç¦»vueèç¬ç«è¿è¡çã
æ¬ææ¯ç»åå®ç½æºç æåæ ¸å¿ææ³æåèªå·±çVuexï¼èå®ç½çVuexï¼ä¸ºäºé¿å
storeç»æèè¿ï¼è¿å®ç°äºmodulesçåè½ï¼å
·ä½å®ç°å¯ä»¥æ¥çVuexå®ç½æºç ã

