Javascript 如何更新reducer中对象的1属性?
我有一个reduxreducer,如下所示:Javascript 如何更新reducer中对象的1属性?,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我有一个reduxreducer,如下所示: const initialState = { visitedData:{specialty:false,review:false,reviewUpgrade:false} } const myred= (state = initialState, action) => { switch (action.type) { case 'GO_FOR_IT_SON': return Object
const initialState = {
visitedData:{specialty:false,review:false,reviewUpgrade:false}
}
const myred= (state = initialState, action) => {
switch (action.type) {
case 'GO_FOR_IT_SON':
return Object.assign({}, state, { visitedData: action.data });
default:
return state
}
}
现在,从我的组件中,我将调用如下内容:
store.dispatch({type: 'GO_FOR_IT_SON', data:{review:true} });
或:
因此,这些语句中的每一条都应该将visitedData的一个属性设置为true/false,并保持其他属性不变。
如何将visitedData的每个属性设置为true/false,而保持其他属性不变?我建议为每个可更改的属性设置一个缩减器和操作:
import { combineReducers } from 'redux';
const specialty = (state = false, action) => {
if (action.type === 'TOGGLE_SPECIALTY') {
return action.data;
}
return state;
};
const review = (state = false, action) => {
if (action.type === 'TOGGLE_REVIEW') {
return action.data;
}
return state;
};
const myred = combineReducers({
specialty,
review
});
但在您的情况下,解决方案是:
const myred= (state = initialState, action) => {
switch (action.type) {
case 'GO_FOR_IT_SON':
return Object.assign({}, state, {
visitedData: Object.assign({}, state.visitedData, action.data)
});
default:
return state
}
}
我建议为每一个可改变的属性设置一个减速机和操作:
import { combineReducers } from 'redux';
const specialty = (state = false, action) => {
if (action.type === 'TOGGLE_SPECIALTY') {
return action.data;
}
return state;
};
const review = (state = false, action) => {
if (action.type === 'TOGGLE_REVIEW') {
return action.data;
}
return state;
};
const myred = combineReducers({
specialty,
review
});
但在您的情况下,解决方案是:
const myred= (state = initialState, action) => {
switch (action.type) {
case 'GO_FOR_IT_SON':
return Object.assign({}, state, {
visitedData: Object.assign({}, state.visitedData, action.data)
});
default:
return state
}
}
我认为这会奏效:
return Object.assign({}, state, {
visitedData: Object.assign({}, state.visitedData, action.data)
});
检查此示例:
设a={b:{a:1,b:2,c:5};
设b={a:5};
设k=Object.assign{},a,{b:Object.assign{},a.b,b};
console.logk 我认为这会奏效:
return Object.assign({}, state, {
visitedData: Object.assign({}, state.visitedData, action.data)
});
检查此示例:
设a={b:{a:1,b:2,c:5};
设b={a:5};
设k=Object.assign{},a,{b:Object.assign{},a.b,b};
console.logk 直截了当的暴力方式: 编辑使用lodash cloneDeep
const _ = require('lodash')
let newState = _.cloneDeep(state)
for(let key in action) {
newState.visitedData[key] = action[key]
}
直截了当的暴力方式: 编辑使用lodash cloneDeep
const _ = require('lodash')
let newState = _.cloneDeep(state)
for(let key in action) {
newState.visitedData[key] = action[key]
}
与其他解决方案相同。我建议将合并到另一行的对象分开,并使用对象扩展以获得更高的可读性
const myred = (state = initialState, action) => {
switch (action.type) {
case 'GO_FOR_IT_SON':
let newVisitedData = {
...state.visitedData,
...action.data
}
return { visitedData: newVisitedData }
default:
return state
}
}
与其他解决方案相同。我建议将合并到另一行的对象分开,并使用对象扩展以获得更高的可读性
const myred = (state = initialState, action) => {
switch (action.type) {
case 'GO_FOR_IT_SON':
let newVisitedData = {
...state.visitedData,
...action.data
}
return { visitedData: newVisitedData }
default:
return state
}
}
常量初始状态={
访问数据:{
特长:假,,
评论:错,
复习成绩:错误
}
}
const myred=state=initialState,action=>{
开关动作类型{
案例“为儿子而努力”:
返回{…state,visitedData:{…state.visitedData,action.data}
违约:
返回状态
}
}
常量初始状态={
访问数据:{
特长:假,,
评论:错,
复习成绩:错误
}
}
const myred=state=initialState,action=>{
开关动作类型{
案例“为儿子而努力”:
返回{…state,visitedData:{…state.visitedData,action.data}
违约:
返回状态
}
}这会改变状态。这会改变状态。您缺少外部状态对象;还原程序需要返回状态参数的更新版本,而不是它的子集。@FakeRainBrigand ya您是对的,更新了我的答案:您缺少外部状态对象;还原程序需要返回状态参数的更新版本,而不是它的子集。@FakeRainBrigand ya你说得对,更新了我的答案:你说我如何将visitedData的每个属性设置为true/false,而保持其他属性不变是什么意思?是否要同时更改多个属性?或者您想在不更改其他状态属性的情况下更改visitedData属性?请勾选此选项:我如何将visitedData的每个属性设置为true/false并保持其他属性不变,这是什么意思?是否要同时更改多个属性?或者,是否要在不更改其他状态属性的情况下更改visitedData属性?请选中:否。请更仔细地查看Object.assign。有两个,不,不是。请更仔细地查看Object.assign。有两个。