Как обновить только 1 поле, не перезаписывая другие поля вложенного объекта в React Hooks с помощью Reducer? - PullRequest
1 голос
/ 06 февраля 2020

Я начинаю изучать React + хуки. Я сейчас использую Reducer. Но у меня проблема с обновлением моего состояния useReducer. каждый раз, когда я хочу обновить 1 поле в моем состоянии объекта, все остальные поля будут удалены.

Мое решение состоит в том, чтобы передать им все существующие значения, даже если мне нужно обновить только 1 поле. Есть ли более эффективный способ сделать это?

Вот мое решение:


const initialState = {
    filter: {
        text: "Filter",
        list: [],
        isActive: false,
        message: "",
    },
    apiList: []
};

const reducer = (state, action) => {
  switch (action.type) {
    case "SET_FILTER_LIST":
      return {
        ...state,
        filter: { ...state.filter,
            list: action.payload.list,
            isActive: action.payload.isActive,
            message: action.payload.message,
            text: action.payload.text,
        }
      };

    default:
      return state;
  }
};
//BELOW - I just want to pass the e.target.textContent to text field. To avoid deleting the other fields. I re-pass all the existing value so it wont get deleted.

  const onSelect = e => {
      let filter = e.target.textContent;

      dispatch({
        type: 'SET_FILTER_LIST',
        payload: {
            list: state.filter.list,
            text: filter,
            message: state.filter.message,
            isActive: state.filter.isActive
        }
      });
  };

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Вы можете использовать следующий код:

return {
    ...state,
    filter: {
        ...state.filter,
        ...action.payload,
    }
};
0 голосов
/ 06 февраля 2020

Если я вас понимаю, у вас уже есть ответ:

return {
    ...state,
    filter: {
        ...state.filter,
        text: action.payload
    }
}

, тогда только текстовое поле передается в полезную нагрузку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...