我有一个组件Home,可以根据状态以不同的方式进行渲染。
我正在尝试从本地存储设置Home的状态
/*
The AuthContext
const globalState = {
email: null,
token: null
};
*/
export default function Home() {
const [user, setUser] = useContext(AuthContext);
useEffect(() => {
const token = localStorage.getItem('token') || null;
const email = localStorage.getItem('email') || null;
setUser({email, token});
})
}
这个错误不断出现,我不知道如何解决
超过了最大更新深度。当组件在useEffect 内调用setState时,可能会发生这种情况
我试图删除useEffect,但弹出了另一个错误
超过了最大更新深度。当组件在componentWillUpdate或componentDidUpdate 内重复调用setState时,可能会发生这种情况
我知道这个错误是由重复调用setUser引起的。
但是我不知道如何只调用一次setUser。
useEffect()
在项目渲染时被调用,设置状态会导致组件重新渲染。向useEffect
块添加一个空的依赖项数组。这将允许块仅在初始渲染时运行。
const [user, setUser] = useContext(AuthContext);
useEffect(() => {
const token = localStorage.getItem('token') || null;
const email = localStorage.getItem('email') || null;
setUser({email, token});
}, [])
由于这种情况应该只发生一次,并且useState
有点多余,因此可以使用useMemo
获得相同的结果。这有点不太习惯,因为从localStorage
获取数据是一种副作用,但在这种情况下更简单。
const user = useMemo(() => {
const token = localStorage.getItem('token') || null;
const email = localStorage.getItem('email') || null;
return { email, token };
}, [])