【发布时间】:2019-10-27 00:06:03
【问题描述】:
在收听history 更改useEffect 时,我遇到了useState 的一些问题。
当pathname 更改时,setState 被启动,但随后state 被添加回来。
例如,我有一个收集通知组的flag 组件,但在pathname 更改时,我希望从state 中解除并删除所有标志。
标志组件
const PageFlag = ({ history }: InterfaceProps) => {
const { contextData, dismissFlag, dismissAllFlags } = useContext(GlobalConsumer);
useEffect(() => {
history.listen(() => {
dismissAllFlags();
});
});
return (
<>
<FlagGroup onDismissed={dismissFlag}>
{contextData.flags.map((flag, index) => (
<Flag key={index} {...flag} />
))}
</FlagGroup>
</>
);
};
历史道具从import { withRouter } from 'react-router-dom'使用
dismissAllFlags 的状态和功能在 createContext 组件中显示为
const DefaultState: InterfaceState = {
otherStateExample: false,
flags: []
};
export const GlobalConsumer = createContext({
contextData: DefaultState,
addFlag: (flagData: any) => {},
dismissFlag: () => {},
dismissAllFlags: () => {}
});
export const GlobalProvider = ({ children }: InterfaceProps) => {
const [state, setState] = useState<InterfaceState>({
...DefaultState
});
return (
<GlobalConsumer.Provider
value={{
contextData: state,
addFlag: (flagData: any) => {
setState({ ...state, flags: [flagData].concat(state.flags) });
},
dismissFlag: () => {
setState({ ...state, flags: state.flags.slice(1) });
},
dismissAllFlags: () => {
setState({ ...state, flags: [] });
}
}}
>
{children}
</GlobalConsumer.Provider>
);
};
问题出现了,在 pathname 更改时,dismissAllFlags 使用 setState 将 flags 设置为 [],但随后使用 flags 添加回之前的状态。
我怎样才能删除所有flags,但记住当前state 用于其他items?
【问题讨论】:
-
你能提供一个codeandbox吗?
-
您的
GlobalProvider似乎可以在pathname更改及其默认状态之间被卸载。
标签: javascript reactjs typescript react-hooks