У меня есть родительско-дочерний компонент Modal и ModalContent в моем приложении React. Оба они работают.
1) Я создал AppContext в App.js для доступа к нему глобально во всех компонентах.
const [state, dispatch] = useReducer(reducer, {modalOpen: false, content: []});
<AppContext.Provider value={{ state, dispatch }} >
//BrowserRouter and Routes Definition
</App>
Здесь reducer - это довольно простая функция с переключателем для modalOpen и функциональными возможностями push / pop в содержимом (массив).
2) Мой Modal Компонент использует
const { state, dispatch } = useContext(AppContext);
<Modal open={state.modalOpen} />
чтобы получить состояние модальной видимости, чтобы установить его открыто / закрыто.
3) Мой ModalContent Компонент использует
const { state, dispatch } = useContext(AppContext);
<ModalContent data={state.content} />
//Dispatch from the `ModalContent`
dispatch({ type: 'UPDATE_CONTENT', data: 'newata' });
4) Вот мой редуктор.
export const reducer = (state, action) => {
switch (action.type) {
case 'TOGGLE_MODAL':
return {...state, modalOpen: !state.modalOpen};
case 'UPDATE_CONTENT':
return { ...state, content: [...state.content, action.data]};
default:
return {modalOpen: false,content: []};
}
}
Я установил некоторый код в ModalContent для обновления свойства data content с помощью диспетчеризации, и хранилище редуктора обновляется идеально и возвращает свежий / обновленный:
{modalOpen: true/false, content: updatedContentArray}
Проблема: всякий раз, когда я отправляю действие через ModalContent состояние завершения, возвращается (ожидается) редуктором, и Modal повторно открывается, когда он прослушивает state.modalOpen.
Неудачная попытка: я попытался получить необходимые свойства в соответствующих компонентах. Но компонент Modal по-прежнему выполняет повторную визуализацию, даже если изменяется только содержимое. Есть ли способ следить только за определенным состоянием
Как можно заставить эту работу работать, выполняя повторную визуализацию только ModalContent, а не Modal.
Изменить: обновлен вопрос с моим макетом (работающим) кодом редуктора и оператором отправки из самого ModalContent.
Modalс помощьюReact.memo, чтобы он был мемоизированным компонентом, который не будет повторно отображаться, еслиstate.modalOpenимеет то же значение. - person ford04   schedule 30.05.2020