如何使用 Redux 只更改一个参数?
How to change just one parameter using Redux?
我尝试使用 Redux 更新我的全局状态,但我尝试只更新五个参数中的一个,而不是全部。
我的商店代码如下:
const initialState = {
loggedIn: false,
thisUser: {}
}
export function usersReducer(state = initialState, action) {
switch (action.type) {
case 'users/loggedIn':
return { ...state, loggedIn: action.payload }
case 'users/addUser':
return { ...state, thisUser: action.payload }
default:
return state
}
}
我试着写了一个新案例,但是没有用:
case 'users/setActivated':
return { ...state, thisUser.activated: action.payload }
VS Code 不允许我写“.activated”
我的调度看起来像:
dispatch({ type: 'users/setActivated', payload: 1 })
怎么了?
嗯,你的语法是错误的,就是这样。 :)
case 'users/setActivated':
return { ...state, thisUser: {...state.thisUser, activated: action.payload} }
是您 shallow-merge state
需要 shallow-merged 嵌套对象。
请注意,深入研究这样的对象很快就会变得很老,您可能想看看例如immer
.
我明白你为什么这样做了,你觉得这很合乎逻辑,但它行不通。
const state = {
...state,
[thisUser.activated]: action.payload
};
因此您的目标是将状态更新为如下所示:
{
loggedIn: true,
thisUser: {
//other properties ,
activated: 1,
}
}
首先,这是您所做操作的输出:
{
loggedIn: true,
thisUser: {
//other properties ,
activated: 0,
},
activated: 1,
};
其次,JavaScript 不接受此 thisUser.activated
作为密钥。
解决方法:
{
...state,
thisUser: {
...state.thisUser,
activated: action.payload
},
};
我尝试使用 Redux 更新我的全局状态,但我尝试只更新五个参数中的一个,而不是全部。
我的商店代码如下:
const initialState = {
loggedIn: false,
thisUser: {}
}
export function usersReducer(state = initialState, action) {
switch (action.type) {
case 'users/loggedIn':
return { ...state, loggedIn: action.payload }
case 'users/addUser':
return { ...state, thisUser: action.payload }
default:
return state
}
}
我试着写了一个新案例,但是没有用:
case 'users/setActivated':
return { ...state, thisUser.activated: action.payload }
VS Code 不允许我写“.activated”
我的调度看起来像:
dispatch({ type: 'users/setActivated', payload: 1 })
怎么了?
嗯,你的语法是错误的,就是这样。 :)
case 'users/setActivated':
return { ...state, thisUser: {...state.thisUser, activated: action.payload} }
是您 shallow-merge state
需要 shallow-merged 嵌套对象。
请注意,深入研究这样的对象很快就会变得很老,您可能想看看例如immer
.
我明白你为什么这样做了,你觉得这很合乎逻辑,但它行不通。
const state = {
...state,
[thisUser.activated]: action.payload
};
因此您的目标是将状态更新为如下所示:
{
loggedIn: true,
thisUser: {
//other properties ,
activated: 1,
}
}
首先,这是您所做操作的输出:
{
loggedIn: true,
thisUser: {
//other properties ,
activated: 0,
},
activated: 1,
};
其次,JavaScript 不接受此 thisUser.activated
作为密钥。
解决方法:
{
...state,
thisUser: {
...state.thisUser,
activated: action.payload
},
};