【发布时间】:2021-10-28 06:50:29
【问题描述】:
最近,我正在制作我的 web 应用程序,但我正在努力解决一个小问题(对我来说并不小)
下面是我的 app.js,我想通过登录/退出状态有条件地渲染 NAV 组件。 (你可以看到它在 Switch 外面!)
<>
<Nav indexStatus={indexStatus} setIndexStatus={setIndexStatus} />
<Index indexStatus={indexStatus} setIndexStatus={setIndexStatus} />
<Switch>
<Route exact path="/" component={Auth(LandingPage,null)}/>
<Route exact path="/login" component={Auth(LoginPage,false)}/>
<Route exact path="/calendar" component={Auth(Calendar,true)} />
<Route exact path="/about" component={Auth(About,false)} />
<Route exact path="/register" component={Auth(RegisterPage,false)}/>
</Switch>
</>
为了检查登录状态,我在用户登录/退出时为 localStorage 提供了 true/false 值
登录:
dispatch(loginUser(body))
.then(response=>{
if(response.payload.loginSuccess){
localStorage.setItem('user',response.payload.loginSuccess)
props.history.push("/")
console.log(props.parentNode)
}else{
alert('login failed')
}
})
退出:
axios.get("/api/users/logout")
.then(res=>{
if(res.data.success){
console.log(res)
history.push('/login')
localStorage.setItem('user','false')
}else{
alert("Logout failed")
}
})
}
我给了 localStorage 值,如下所示:
const [loginStatus,setLoginStatus] =useState(localStorage.getItem('user'))
我用 console.log 检查它,它工作正常
所以我使用 useEffect 来更改 loginStatus 值,并仅重新渲染 localstorage 已更改
const checkLoginStatus= localStorage.user
useEffect(()=>{
if(checkLoginStatus==='true'){
setLoginStatus(true)
}else{
setLoginStatus(false)
}
},[checkLoginStatus])
console.log(localStorage.user)
最后,我用 ?: 运算符编写了代码,如下所示
return (
<>
{loginStatus ===true ? (
<div>
<div className="nav">
<h2>TITLE</h2>
<div className="buttons">
<div>About</div>
<div>How to use</div>
<button onClick={logoutHandler}>Logout</button>
<StyledLink to="/login"><FontAwesomeIcon icon={faSignInAlt}/></StyledLink>
<button onClick={()=>setIndexStatus(!indexStatus)} >Index</button>
</div>
</div>
</div>)
:
( <div>
<div className="nav">
<h2>TITLE</h2>
<div className="buttons">
<div>About</div>
<div>How to use</div>
<button onClick={logoutHandler}>Logout</button>
<StyledLink to="/login"><FontAwesomeIcon icon={faSignInAlt}/></StyledLink>
<StyledLink to="/register"><FontAwesomeIcon icon={faUserPlus}/></StyledLink>
<button onClick={()=>setIndexStatus(!indexStatus)} >Index</button>
</div>
</div>
</div>
)}
</>
);
}
export default Nav
但是,问题是它只能部分工作,我必须刷新页面才能工作组件条件渲染。我不确定为什么会这样,即使我使用 useEffect 和第二个参数 [checkLoginStatus]
你能告诉我为什么不能正常工作吗?我的逻辑怎么错了? 感谢阅读,感谢您的帮助
【问题讨论】:
-
checkLoginStatus 什么时候更新?如果您正在考虑 localStorage.user 何时更改,那么我认为这是您错的地方。
-
本地存储非常被动。您基本上可以设置/获取值。您问题中的代码是否都是一个组件?您应该使用 React 状态来跟踪当前的身份验证状态,从本地存储初始化并持久化到本地存储。本地存储并不意味着 状态。您仍然需要更新 React 状态和/或 props 以触发 React 重新渲染组件并再次从 localStorage 读取以获取当前值。
-
@DrewReese 感谢您的具体回答。那么你能推荐我一种更新状态的方法吗?我在编码方面很新,我不知道该怎么做 tbh
-
当然,没问题。我觉得我需要先看一个完整的代码示例,因为不清楚这些代码 sn-ps 相对于彼此的位置。据我所知,您可以将
loginStatus状态移动到组件中,渲染路由和Nav组件并传递状态并作为道具更新给需要它们的组件。AuthHOC 在做什么? -
useEffect 帮不了你。您应该使用StorageEvent 订阅更改,因为本地存储是被动的(您可以读取或写入)
标签: javascript reactjs