【发布时间】:2021-06-13 19:49:04
【问题描述】:
我想从我的后端获取数据,相应地更改“isLoggedIn”状态,从而有条件地渲染组件。我只是无法理解如何以组件不会呈现两次的方式构造它。
首先在我的 AuthForm 组件中,有一个登录功能。它设置了一个用于刷新 JWT 令牌的 httpOnly cookie,并直接在标头上设置了一个 JWT 令牌。
const login = async () => {
try {
const response = await axios.post(props.baseUrl + "/auth/login", {
email,
password,
})
axios.defaults.headers.common[
"Authorization"
] = `Bearer ${response.data.token}`
dispatch(toggleLogin(true))
} catch ({ response }) {
console.log(response)
}
}
因为我想显示游戏 UI 而不是 AuthForm,所以我正在调度 toggleLogin 操作。
在主组件中,我有一个 refreshToken 函数,它检查客户端是否有一个 httpOnly cookie,如果它有效则返回一个新的 JWT。这样用户在页面刷新时仍然登录。
const Tamagotchi = () => {
const isLoggedIn = useSelector((state) => state.isLoggedIn)
const dispatch = useDispatch()
const refreshToken = async () => {
try {
const response = await axios.get(baseUrl + "/auth/refresh-token")
axios.defaults.headers.common[
"Authorization"
] = `Bearer ${response.data.token}`
dispatch(toggleLogin(true))
setTimeout(() => {
refreshToken()
}, response.data.expiresIn * 1000 - 500)
} catch ({ response }) {
if (response.status !== 201) {
dispatch(toggleLogin(false))
console.log("Not authorized")
}
}
}
useEffect(() => {
refreshToken()
})
return (
<TamagotchiWrapper>
<TamagotchiView>
{isLoggedIn ? <TamagotchiUI /> : <AuthForm />}
</TamagotchiView>
</TamagotchiWrapper>
)
}
如果用户正在登录,或者正在刷新页面,Tamagotchi 组件会被渲染两次。由于isLoggedIn 发生了变化,因此状态发生了变化,因此它再次呈现并再次调用 useEffect 挂钩。
这个怎么办?
提前致谢。
【问题讨论】:
标签: javascript reactjs redux react-redux