原則:
中小型項目中,如果組件的公共狀態不多的情況下,不建議使用vuex,反而會增加代碼復雜度,想要組件通信,直接通過event bus即可,中大型項目中,多個組件公共狀態較多情況下,建議使用vuex
vuex的具體工作流程如下:
在倉庫state中定義公共狀態,action中發送異步請求,得到數據后調用mutation 賦值給state,組件中使用state,也可以在組件中 dispatch action和觸發mutation來修改state,視圖刷新
具體代碼如下:
倉庫代碼
const store = new Vuex.Store({
state: {
items: [] // 定義一個公共的購物車數據
},
getters: {
// 可以基于已有的state 派生新的狀態
selectedItems (state) {
// 過濾購物車中未選中的商品
return state.items.filter(item => item.selected)
}
},
mutations: {
// 定義mutation來修改state
INIT_ITEMS(state, items){
state.items = items
}
},
actions: {
// action可以發送異步請求,得到數據后commit mutation將請求結果傳入
FETCH_ITEMS({commit}, params = {}){
// 調用封裝好的 接口函數
fetchItem(params).then(res => {
if(res.data.code === 200) {
commit('INIT_ITEMS', res.data.data)
}
})
}
}
})
組件中使用 使用vuex
// 獲取state
this.$store.state.items // 直接獲取
{
computed: {
...mapState(['items']) // 助手函數獲取
}
}
// 獲取getters
this.$store.getters.selectedItems // 直接獲取
{
computed: {
...mapGetters(['selectedItems']) // 助手函數獲取
}
}
// 組件中提交action
this.$store.dispatch('FETCH_ITEMS', {token: 'xxx'})
{
methods: {
...mapActions(['FETCH_ITEMS']) // 助手函數 直接調用this.FETCH_ITEMS(params)觸發
}
}
// 組件中也可以直接commit mutation
this.$store.commit('INIT_ITEMS'[,參數])
{
methods:{
...mapMutations(['INIT_ITEMS']) // 助手函數 直接調用this.INIT_ITEMS(參數)
}
}