vue.js - 正确设置和使用 VUEX 存储突变类型
问题描述
我正在使用来自 Github 的 Vue js 样板之一开发 Chrome 扩展。默认样板设置如下:
存储/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import mutations from './mutations';
import * as actions from './actions'; // all actions are imported as separate vars
Vue.use(Vuex);
export default new Vuex.Store({
state: { },
mutations,
actions
});
然后在actions.js
import * as types from './mutation-types';
export const setFoo = ({ commit }, payload) => {
commit(types.SET_FOO, payload); // SET_FOO is defined in the mutation-types file
};
我认为上述方法缺乏我们要使用突变类型文件的根本原因——避免重新输入突变和动作的名称。
所以相反,我想出了一个不同的方法:
存储/index.js
...
import actions from './actions'; // actions are imported as separate functions
...
然后在actions.js
import * as types from './mutation-types';
export default {
[types.UPDATE_FOO] ({commit}, payload) {
commit(types.UPDATE_FOO, payload);
}
}
然后在扩展中的任何地方,我们还可以使用 const 名称导入突变类型和调度操作,如下所示:
store.dispatch(types.UPDATE_FOO, 'some value');
第二种方法在命名然后调度/提交我们的动作/突变方面似乎更实用。或者最新的有什么问题吗?
以上哪一项通常是更好的做法?
解决方案
第一种方法更可取,但这完全取决于您。Vuex
官方文档
中使用了类似的方法。参考
// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'
const store = new Vuex.Store({
state: { ... },
mutations: {
// we can use the ES2015 computed property name feature
// to use a constant as the function name
[SOME_MUTATION] (state) {
// mutate state
}
}
})
// actions.js
actions: {
checkout ({ commit, state }, products) {
// save the items currently in the cart
const savedCartItems = [...state.cart.added]
// send out checkout request, and optimistically
// clear the cart
commit(types.CHECKOUT_REQUEST)
// the shop API accepts a success callback and a failure callback
shop.buyProducts(
products,
// handle success
() => commit(types.CHECKOUT_SUCCESS),
// handle failure
() => commit(types.CHECKOUT_FAILURE, savedCartItems)
)
}
}
推荐阅读
- javascript - event.target 未定义,有时,在 React 的 handleChange 函数中
- mysql - 如何在考虑 linq2db (CONVERT_TZ) 中的时区的同时按日期分组?
- angular - 如何以角度覆盖 RxJS 主题的 Jasmine 单元测试
- r - 只有 x(或 y)轴的热图
- sql - 更新满足以下条件的行
- sql - 如何根据引用另一个数据库中表的唯一列删除表中的重复行
- vue.js - Vuetify 数据表移动断点
- python - Facebook DrQA 错误 - 当 allow_pickle=False 时无法加载对象数组
- angular6 - 什么是在 Angular 中的组件和服务之间进行通信的好方法
- mysql - 将 group by 与内部联接一起使用时得到错误的总和