javascript - 在history.listen的useEffect中使用useState钩子(Hook)

标签 javascript reactjs typescript react-hooks

在监听 useEffect 中的 history 更改时,我在 useState 方面遇到了一些问题。

路径名更改时,setState会启动,但随后状态会被添加回来。

例如,我有一个收集通知组的 flag 组件,但在 pathname 更改时,我希望所有标志都被忽略并从 中删除状态

标志组件

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>
    </>
  );
};

History 属性用于 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 使用 setStateflags 设置为 [] 但随后使用 flags 添加回之前的状态。

如何删除所有标志,但记住其他项目的当前状态

最佳答案

您缺少 useEffect() 上的第二个输入参数,这将导致在每次渲染时读取监听器。

它应该看起来像这样,注意你也不应该需要内部函数。

useEffect(() => {
  history.listen(dismissAllFlags)
}, []);

关于javascript - 在history.listen的useEffect中使用useState钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575648/

相关文章:

javascript - 在 React 中使用 refs 有什么不好的做法?

typescript - 是什么| (pipe) 表示在 TypeScript 中类型的开头

javascript - 编辑可写类型数组时,Svelte UI 未正确更新

javascript - jQuery:检查元素是否已分配给 var

javascript - javascript RegExp 正则表达式错误中的 Internet Explorer 11 语法错误

javascript - 如何在 html5 中构建表单时显示警告标志?

javascript - 如何使用纯 Reactjs 制作折叠 TextView ?

javascript - 在 JavaScript 中实现相对定位元素的拖放

javascript - 从 firebase 获取正确路径时出错

javascript - 提取和验证