我正在尝试检查 authState 是否为 true 以向用户显示我的侧边栏。它有效,但我得到了一个无限循环。
这里是 useEffect 和 useState
const [ authState, setAuthState ] = useState({
username: "",
id: 0,
status: false
});
useEffect(() => {
axios.get('http://localhost:4000/users/auth/v', {withCredentials: true}).then((res) => {
console.log(res.data);
if (res.data.error) {
setAuthState({ ...authState, status: false });
} else {
setAuthState({
username: res.data.username,
id: res.data.id,
status: true
});
console.log(authState);
}
});
},[authState]);
编辑:我实际上使用的是 useContext
return (
<>
<AuthContext.Provider value={{ authState, setAuthState }}>
<Router>
<Sidebar />
<Switch>
<Route path='/' exact component={Auth} />
<Route path='/users/add' exact component={AddUser} />
<Route path='/users' exact component={UserList} />
<Route path='/users/:id' exact component={UserEdit} />
<Route path='/roles/add' exact component={AddRole} />
<Route path='/roles' exact component={RoleList} />
<Route path='/roles/:roleId' exact component={EditRole} />
<Route path='/logout' exact component={Logout} />
</Switch>
</Router>
</AuthContext.Provider>
</>
);
}
更新
现在使用此代码,但当我进入时,例如,让我们说 /users
我需要刷新页面,让 authState
的状态被识别为 {{ 1}} 通过侧边栏然后侧边栏出现
true
这是我的侧边栏
useEffect(() => {
axios.get('http://localhost:4000/users/auth/v', {withCredentials: true}).then((res) => {
console.log(res.data);
if (res.data.error) {
setAuthState({ ...authState, status: false });
} else {
setAuthState({
username: res.data.username,
id: res.data.id,
status: true
});
}
});
},[]);
答案 0 :(得分:0)
由于在 useEffect 结束时您正在更改 authState,它再次调用 useEffect。我建议有一个标志来触发检查 authState 是否更新并停止循环,代码可能有点错误,因为我刚刚在这里写的 :P,在调用 setAuthState 之前,您还必须将 updateAuth 设置为 true。如果你想让它像 Hamza Khursheed 所说的那样只在开始时运行,只需从依赖数组中移除 authState(使用效果的第二个参数)
const [ authState, setAuthState ] = useState({
username: "",
id: 0,
status: false
});
const [ updateAuth, setUpdateAuthState ] = useState(false)
useEffect(() => {
if(updateAuth){
axios.get('http://localhost:4000/users/auth/v', {withCredentials:
true}).then((res) => {
console.log(res.data);
if (res.data.error) {
setAuthState({ ...authState, status: false });
} else {
setAuthState({
username: res.data.username,
id: res.data.id,
status: true
});
setUpdateAuthState(false);
console.log(authState);
}
});
}
},[authState]);
答案 1 :(得分:0)
您应该调整您的依赖项数组以反映您希望 useEffect
触发的更改。如果您想在路线更改时获得授权状态,这应该可行:
React.useEffect(() => {
axios
.get('http://localhost:4000/users/auth/v', { withCredentials: true })
.then((res) => {
console.log(res.data);
if (res.data.error) {
setAuthState({ ...authState, status: false });
} else {
setAuthState({
username: res.data.username,
id: res.data.id,
status: true,
});
console.log(authState);
}
});
}, [window.location.pathname]);