这是我第一次使用 react js,我试图在离开此视图时删除警报,因为我不想在另一个视图上显示它,但如果没有错误,我想保持成功警报显示当我要重定向到另一个视图时
但我在谷歌浏览器上穿了这个 Line 97:6: React Hook useEffect has a missing dependency: 'dispatch'. Either include it or remove the dependency array react-hooks/exhaustive-deps
如果我确实包含调度,我会得到无限循环
const [state, dispatch] = useUserStore();
useEffect(() => {
let token = params.params.token;
checktoken(token, dispatch);
}, [params.params.token]);
useEffect(() => {
return () => {
if (state.alert.msg === "Error") {
dispatch({
type: REMOVE_ALERT
});
}
};
}, [state.alert.msg]);
//response from the api
if (!token_valide || token_valide_message === "done") {
return <Redirect to="/login" />;
}
这是 useUserStore
const globalReducers = useCombinedReducers({
alert: useReducer(alertReducer, alertInitState),
auth: useReducer(authReducer, authInitState),
register: useReducer(registerReducer, registerInitState),
token: useReducer(passeditReducer, tokenvalidationInitState)
});
return (
<appStore.Provider value={globalReducers}>{children}</appStore.Provider>
);
};
export const useUserStore = () => useContext(appStore);
原文由 Buk Lau 发布,翻译遵循 CC BY-SA 4.0 许可协议
2020 年 9 月 11 日更新
eslint-plugin-react-hooks@4.1.0
及以上版本不再需要此解决方案。现在
useMemo
和useCallback
可以安全地接收引用类型作为依赖项。 #19590这是另一个如何安全地稳定(规范化)回调的示例
Now referential types with stable signature such as those provenients from
useState
oruseDispatch
can safely be used inside an effect without triggeringexhaustive-deps
even when coming fromprops
旧答案
dispatch
来自自定义hook
所以它没有稳定的签名,因此在每次渲染时都会改变(参考相等)。通过将处理程序包装在useCallback
挂钩中来添加额外的依赖层useCallback
和useMemo
是辅助钩子,主要目的是添加额外的 依赖检查 层以确保同步性。通常你想使用useCallback
来确保对prop
你知道如何改变而 React 不会改变的稳定签名。A
function
(引用类型)通过props
例如假设您有一个子组件,在安装时必须在父组件中设置一些状态(不常见),上面的代码将在
useEffect
中生成未声明依赖项的警告,所以让我们声明setParentState
作为 React 检查的依赖项现在,这种效果在每次渲染时都会运行,不仅在安装时,而且在每次更新时。发生这种情况是因为
setParentState
是function
每次调用函数Component
时都会重新创建它。你知道setParentState
不会改变它的签名超时,所以告诉 React 是安全的。通过将原始助手包装在useCallback
中,您就是这样做的(添加另一个依赖检查层)。你去吧。现在
React
知道stableSetter
不会在生命周期内改变它的签名,因此效果不需要太不必要地运行。附带说明
useCallback
它也像useMemo
一样使用,以优化昂贵的函数调用(记忆)。useCallback
的两个主要目的是优化依赖引用相等的子组件以防止不必要的渲染。 字体
记住昂贵的计算