簡(jiǎn)單使用vuex狀態(tài)管理
vuex狀態(tài)管理
概述
- vuex主要由state,mutations,actions,getters四部分構(gòu)成(modules本文暫不闡述)
- state
- 全局狀態(tài),只讀
- 組件讀取state方式
- 根組件上引入并掛載store對(duì)象,其他組件在計(jì)算屬性通過(guò)$store獲取狀態(tài)
- 可以在計(jì)算屬性上使用mapState輔助函數(shù)簡(jiǎn)化state獲取過(guò)程
- getters
- 全局狀態(tài)的計(jì)算屬性
- 組件讀取getters方式,同state
- getters參數(shù)
- state(全局狀態(tài))
- getters (全局其他getters)
- 可以通過(guò)閉包(返回一個(gè)新函數(shù))進(jìn)行函數(shù)式傳參調(diào)用
- mutations
- 唯一改變?nèi)譅顟B(tài)的方法,只允許同步修改state
- 組件使用mutations方式
- 使用$store.commit(名字, 參數(shù))
- 可以在組件methods中使用mapMutations輔助函數(shù)簡(jiǎn)化
- mutations-types(可選)
- 可以使用常量來(lái)代替字符串,以減少提交mutation的類型的出錯(cuò)率
- 如:increment -> export const INCREMENT = "increment"
- actions
- 允許異步改變?nèi)譅顟B(tài)的方式
- 本質(zhì)是在action函數(shù)內(nèi)部手動(dòng)提交mutation
- 組件使用actions方式
- 使用$store.dispatch(名字, 參數(shù))
- actions參數(shù)
- context對(duì)象,包含conmmit, dispatch方法,state等
- payload
- 可以在action函數(shù)中使用promise來(lái)控制異步任務(wù)順序
代碼示例
// store
import Vuex from "vuex";
import Vue from "vue";
Vue.use(Vuex);
const store = new Vuex.Store({
// 開(kāi)發(fā)環(huán)境下開(kāi)啟嚴(yán)格模式,不是由 mutation 函數(shù)改變的,將會(huì)拋出錯(cuò)誤
strict: process.env.NODE_ENV !== "production",
state: {
count: 1,
msg: "我是msg",
},
mutations: {
// 同步改變count
increment(state, payload) {
state.count += payload;
},
setMsg(state, payload) {
state.msg = payload;
},
},
actions: {
// 異步改變count
incrementAsync({ commit }, payload) {
return new Promise((resolve) => {
setTimeout(() => {
commit("increment", payload);
resolve("ODK");
}, 2000);
});
},
},
getters: {
// count的計(jì)算屬性,可以使用其他getters
countAddHundred({ count }, { countSubHundred }) {
return count + countSubHundred * 10 + 100;
},
countSubHundred(state) {
return state.count - 100;
},
// getters傳參
countmutiNum({ count }) {
return (num) => count * num;
},
},
});
export default store;
// 組件
<template>
<div>
<input v-model="message" />
<p>{{ msg }}</p>
<button @click="btnClick">點(diǎn)擊+10</button>
<p>{{ count }}</p>
<!-- getters傳參 -->
<p>{{ countmutiNum(6) }}</p>
</div>
</template>
<script>
// 使用輔助函數(shù),避免每次從$store導(dǎo)出
import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
export default {
methods: {
...mapMutations(["increment", "setMsg"]),
...mapActions(["incrementAsync"]),
async btnClick() {
// 分發(fā)一個(gè)異步action,返回的是一個(gè)promise
const result = await this.incrementAsync(10);
console.log(result);
},
},
computed: {
...mapState(["count", "msg"]),
...mapGetters(["countAddHundred", "countSubHundred", "countmutiNum"]),
// 使用v-model雙向綁定vuex的數(shù)據(jù),需要重寫(xiě)set方法
message: {
get() {
return this.msg;
},
set(value) {
this.setMsg(value);
},
},
},
};
</script>
關(guān)系圖


浙公網(wǎng)安備 33010602011771號(hào)