【问题标题】:Nested reducers don't be updated嵌套减速器不更新
【发布时间】:2019-04-06 20:15:48
【问题描述】:

我有一个关于嵌套减速器的问题。

结构类似这样:

const INITIAL_STATE = {
    items: [],
    planningState:null,
    loading: false,
    idx_selected : '2'
};

在 state.items 中,结构是这样的:

const mockItems = [
{
    date: "2018-08-24 15:00:00",
    type: "dropoff",
    status: null,
    id: "553",
    //many others things
},
{
    date: "2018-08-24 19:00:00",
    type: "pickup",
    status: "ordered",
    id: "553",
    //other things
},
{
    date: "2018-07-18 08:00:00",
    type: "delivery",
    status: null,
    id: "554",
    //other things
},

];

我需要更改一项的状态,而不更改其他属性。我知道我必须克隆每一层,但我犯了一个错误。

case SCAN_CLOSE_DONE:
  //state.items[state.idx_selected].status=done
     return{
      ...state,
      items:{
        ...state.items,
        [state.idx_selected]:{
          ...state.items[state.idx_selected],
            status: "done"
        }
      }
    };

【问题讨论】:

    标签: react-native redux nested reducers


    【解决方案1】:
    return {
      ...state,
      items: state.items.map(item =>
        {
          ...item,
          status: "done"
        }
      )
    }
    

    【讨论】:

      【解决方案2】:

      将处理该状态块的所有内容的 reducer 分解为多个 reducer,每个 reducer 处理该块的一部分。

      const items = (state = [], { type, items, item, idx_selected, status }) => {
          switch(type) {
              case SCAN_CLOSE_DONE:
              const newState = [...state];
              const item = { ...newState[idx_selected], status };
              newState[idx_selected] = item;
              return newState;
      
              //...
      
              default:
                  return state;
          }
      };
      
      // just examples, actual use case might be different:
      const planningState = (state = null, { type, planningState }) => type === MY_ACTION ? planningState : state;
      const loading = (state = null, { type, loading }) => type === ANOTHER_ACTION ? loading : state;
      const idx_select = //...
      
      export default combineReducers({
          items,
          planningState,
          loading,
          idx_select
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 2021-07-18
        • 2019-07-05
        相关资源
        最近更新 更多