我的 React App 中有一个父子组件Modal和ModalContent都可以使用。
1) 我在 App.js 中创建了一个 AppContext,用于在所有组件中全局访问它。
const [state, dispatch] = useReducer(reducer, {modalOpen: false, content: []});
<AppContext.Provider value={{ state, dispatch }} >
//BrowserRouter and Routes Definition
</App>
这里的reducer是一个相当简单的函数,带有用于modalOpen和内容(数组)中的推送/弹出功能的切换。
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
来使用调度更新数据content
属性,并且减速器存储完美更新并返回新鲜/更新:
{modalOpen: true/false, content: updatedContentArray}
问题是:每当我通过ModalContent
完成状态调度一个动作时,reducer 会返回(预期),并且 Modal 在侦听 state.modalOpen 时会重新打开。
不成功的尝试:我试图在各个组件中专门提取所需的属性。但是Modal
即使仅更改内容,组件仍会重新呈现。有没有办法只关注特定的状态
如何通过仅ModalContent
不重新渲染来完成这项工作Modal
。
编辑:用我的模拟(工作)reducer 代码和来自 ModalContent 本身的调度语句更新了问题。