【发布时间】:2021-09-15 17:01:36
【问题描述】:
我写了一个这样的 react-js 组件:
import Auth from "third-party-auth-handler";
import { AuthContext } from "../providers/AuthProvider";
export default function MyComponent() {
const { setAuth } = useContext(AuthContext);
useEffect(() => {
Auth.isCurrentUserAuthenticated()
.then(user => {
setAuth({isAuthenticated: true, user});
})
.catch(err => console.error(err));
}, []);
};
使用以下 AuthProvider 组件:
import React, { useState, createContext } from "react";
const initialState = { isAuthenticated: false, user: null };
const AuthContext = createContext(initialState);
const AuthProvider = (props) => {
const [auth, setAuth] = useState(initialState);
return (
<AuthContext.Provider value={{ auth, setAuth }}>
{props.children}
</AuthContext.Provider>
)
};
export { AuthProvider, AuthContext };
一切正常,但我在开发者控制台中收到此警告:
React Hook useEffect 缺少一个依赖项:'setAuth'。要么包含它,要么移除依赖数组 react-hooks/exhaustive-deps
如果我将 setAuth 添加为 useEffect 的依赖项,警告就会消失,但我会得到 useEffect() 以无限循环运行,并且应用程序会崩溃。
我知道这可能是因为每次安装组件时都会重新实例化setAuth。
我还想我可能应该使用useCallback() 来避免每次都重新实例化该函数,但我真的不明白如何将useCallback 与useContext() 中的函数一起使用
【问题讨论】:
-
你能显示 AuthContext 代码吗?
-
为了向您展示如何使用
useCallback,我们需要查看setAuth的定义位置(即您渲染AuthContext.Provider的位置) -
你在这里遵循什么官方模式(谁的文档解释你应该这样做)?因为影响是针对组件实例更新时应该发生的副作用。您不应该直接制作其他代码调用效果,该代码应该更新拥有的组件,以便 it 触发适当的副作用。
-
我没有看到无限循环 - codesandbox.io/s/use-context-infinite-loop-q5xk4。代码与您提供的完全一样。
-
@Mike'Pomax'Kamermans:你说得对,我可能确实混合了一些不同的文档来源和示例......你的意思是我不应该在 MyComponent 的 useEffect() 中调用 setAuth 吗?跨度>
标签: javascript reactjs react-hooks use-effect use-context