У меня проблемы с useState
при прослушивании history
изменений в useEffect
.
Когда меняется 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
as
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
?