当我尝试改变状态obj中的属性时,我注意到Vuex中的奇怪行为。
示例:
Mutation: {
authUser: (state, payload) => {
state.email = payload.email
state.password = payload.password
...someOtherProps
}
actions: {
commit ('authUser', {
email: 'user@gmail.com'
})
}
我注意到的是,当我只提交一个属性时(在这种情况下" email"),authUser的所有其他属性的值将是未定义的,只有电子邮件值可用。
这是Vuex在这种情况下的表现吗?如果是,我怎样才能避免其他道具没有得到空值?
由于
答案 0 :(得分:4)
您在没有定义password
属性的情况下传递对象,因此它会相应地更新state
对象。
我只是遍历payload
的属性来更新每个相关的state
对象属性。正如@ 82Tuskers指出的那样,如果payload
对象中的属性在state
对象上尚未存在,则您需要使用Vue.set
(否则属性不会被动反应:
authUser: (state, payload) => {
for (prop in payload) {
if (state.hasOwnProperty(prop)) {
state[prop] = payload[prop];
} else {
Vue.set(state, prop, payload[prop]);
}
}
}
这样,只有payload
对象中传递的属性才会在state
对象上更新。
答案 1 :(得分:1)
这并不奇怪,这是预期的行为。只需改变你的突变(推荐)方式:
authUser: (state, payload) => {
state = Object.assign({}, state, payload)
}
答案 2 :(得分:0)
虽然其他答案似乎可以解决您的问题,但将与用户相关的项目放入州内的user
对象中可能是值得的。最佳做法是预先建立您的州属性,这样您就可以避免使用Vue.set(...)
:
state: {
user: {
email: '',
password: ''
}
}
...然后你可以通过使用点差运算符轻松避免循环:state.user = { ...state.user, ...payload }
- 这基本上说"取出目前state.user
内的所有内容并将其与payload
合并,使用state.user
"
state.payload
中的内容