Заранее : Мое приложение работает, как предполагалось, но я хочу знать, есть ли у меня лучший подход к проблеме.
Ситуация :У меня есть проект, в котором я сейчас внедряю систему разрешений.Текущий поток предназначен для загрузки определенных объектов (в данном случае - user
) и inject
разрешений впоследствии.
Задача : Получение 'Не изменять мутирование vuexхранить состояние вне обработчиков мутаций. ' ошибка внутри vuex-action.
Вопрос: Есть ли лучший способ пропустить ошибку, чем мой подход ниже?
Упрощенно это выглядит так (здесь я получаю свои объекты из нашего API и храню их в vuex-store):
// user.js (vuex-module)
state: {
user: null,
},
mutations: {
// ...
setUser(state, user) {
state.user = user
}
}
actions: {
// ... other vuex-actions
async login({commit, dispatch}, payload) {
let userFromDb = DbUtil.getUser(payload) // is an axios call to our api
// here the permissions get injected
// action in another vuex-module
dispatch('permissions/injectPermissions', userFromDb)
// commiting to store
commit('setUser', userFromDb)
return userFromDb
}
}
My permissions.js (здесь я добавляю права доступа к моему объекту):
// permissions.js (vuex-module)
actions: {
// ... other vuex-actions
// payload = user in this example
async injectPermissions({commit, dispatch}, payload) {
let permissionFromDb = DbUtil.getPermissions(/* ... */)
payload.permissions = permissionFromDb // -> Here I am getting 'Do not mutate vuex store state outside mutation handlers.'-Error, because `payload` == the user from user-state
return payload
}
}
Обходной путь : я добавил мутацию, которая изменяет объект пользовательского состояния для меня внутри обработчик мутаций .
mutations: {
/**
* A 'set'-wrapper to mutate vuex-store variable inside a mutation to avoid getting a error.
* @param state
* @param payload:
* object - object to be mutated
* prop - prop inside object that is affected
* value - value that should be assigned
*/
setWrapper(state, payload) {
let { object, prop, value } = payload
object[prop] = value
}
}
Строка, в которой была выдана ошибка, изменяется на:
commit('setWrapper', {
object: payload,
prop: 'permissions',
value: permissionFromDb
})