【发布时间】:2020-09-18 00:58:02
【问题描述】:
我的 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 切换和 content(数组)中的推送/弹出功能。
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 属性,并且reducer 存储完美更新并返回新鲜/更新:
{modalOpen: true/false, content: updatedContentArray}
问题是:每当我通过ModalContent 调度一个动作时,reducer 会返回(预期的)完整状态,并且 Modal 在侦听 state.modalOpen 时会重新打开。
不成功的尝试:我试图在各个组件中专门提取所需的属性。但是Modal 组件仍然会重新渲染,即使只是更改了内容。有没有办法只关注特定的状态
如何通过仅重新渲染 ModalContent 而不是 Modal 来完成这项工作。
编辑:用我的模拟(工作)reducer 代码和来自 ModalContent 本身的调度语句更新了问题。
【问题讨论】:
-
你能展示你的减速器和调度调用吗?还有问题只是 Modal 正在重新渲染或 openModal 错误地将 modelOpen 值设为 true
-
您可以将
Modal与React.memo增强为记忆组件,如果state.modalOpen具有相同的值,则不会重新渲染。 -
@ShubhamKhatri 我已经添加了我的减速器(工作)的更简单版本,并在上面的代码 sn-p 中添加了一个调度调用。当我关闭它关闭的模式并将状态更新为 false 时,我可以看到 openModal 工作正常。
-
好的,所以问题只是在仅内容更改时重新渲染模态组件?
-
是的@ShubhamKhatri
标签: javascript reactjs react-hooks react-context use-reducer