【发布时间】:2021-08-18 13:20:55
【问题描述】:
我使用 react Hooks,尤其是 useReducer。状态改变,但功能组件不会重新渲染。 应在按下菜单中的按钮后打开抽屉。状态改变,但抽屉没有打开。
这是沙盒代码https://codesandbox.io/s/affectionate-cdn-o0e6u?file=/src/drawer/drawer.tsx
const Drawer: FC = () => {
const [state, dispatch] = useReducer(serviceReducers, serviceState);
const drawerClose = () => {
dispatch({ type: ActionTypes.OPEN_DRAWER, payload: false });
};
const drawer = (
<div>
<IconButton onClick={drawerClose}>
<CancelPresentationIcon />
</IconButton>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
</p>
</div>
);
return (
<nav>
<Drawer
anchor={"left"}
open={state.drawer}
onClose={drawerClose}
ModalProps={{
keepMounted: true
}}
>
{drawer}
</Drawer>
</nav>
);
};
这是减速器
export enum ActionTypes {
OPEN_DRAWER = "openDrawer"
}
export interface ServiceState {
drawer: boolean;
}
interface OpenDrawer {
type: ActionTypes.OPEN_DRAWER;
payload: boolean;
}
export type ServiceActions = OpenDrawer;
export const serviceState = {
drawer: false
};
export function serviceReducers(
state: ServiceState,
action: ServiceActions
): ServiceState {
switch (action.type) {
case ActionTypes.OPEN_DRAWER:
return {
...state,
drawer: action.payload
};
default:
return state;
}
}
【问题讨论】:
-
useReducer状态是本地的,它不像上下文或 Redux 那样共享。所以标题作为它自己的状态并将drawer设置为true对实际的抽屉组件没有影响。 -
清除。什么更好用?使用上下文?
-
在你的情况下,managing the state from a parent component 是最简单的,这里不需要全局状态管理。
标签: reactjs typescript react-hooks use-reducer