Javascript 如何更新reducer中对象的1属性?

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

我有一个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.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。有两个。