【发布时间】:2021-08-28 02:42:47
【问题描述】:
我正在尝试检查 authState 是否为真,以便向用户显示我的侧边栏。它有效,但我得到一个无限循环。
这里是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 的状态识别为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
});
}
});
},[]);
这是我的侧边栏
function Sidebar() {
const [ sidebar, setSidebar ] = useState(false);
let userData = localStorage.getItem('user');
// console.log(userData);
const { authState } = useContext(AuthContext);
const showSidebar = () => setSidebar(!sidebar)
return (
<>
{authState.status &&
<Styles>
<Navbar bg="light">
<Navbar.Brand>
<NavIcon>
<MenuIcon onClick={showSidebar} />
</NavIcon>
</Navbar.Brand>
<Navbar.Text className="user-options">
<span className='user-name'>Hello, {userData}!</span> {/* WIP input user's fname and lname via context */}
<span className='logout-link'><Link to="/logout">Logout</Link></span>
</Navbar.Text>
</Navbar>
<Sidenav sidebar={sidebar}>
<SidebarWrap>
<NavIcon>
<HighlightOffIcon onClick={showSidebar} />
</NavIcon>
<SidebarList>
{SidebarData.map((val, key) => {
return (
<li
key={key}
className='row'
>
<Link
className='link-style'
to={val.link}
id={window.location.pathname === val.link
? "active"
: ""}
>
<SideIcon>{val.icon}</SideIcon>
<SideTitle>{val.title}</SideTitle>
</Link>
</li>
)
})}
</SidebarList>
</SidebarWrap>
</Sidenav>
</Styles>
}
</>
)
}
【问题讨论】:
-
您设置了身份验证状态。但是auth状态是一个依赖,所以会再次触发效果。阅读有关
useEffect中的依赖数组的用途以及如何使用它的文档。 -
只需从 useEffect 依赖数组中移除 authState
标签: reactjs react-hooks use-effect use-state use-context