为什么useEffect不是构造函数?



如果我想在DOM准备好之前调用或检查状态,如何使用useEffect ?

在我的例子中,useEffect在DOM准备好之后被调用。

E。g我有一个父包装器,我的任务是检查本地令牌,如果令牌在那里,重定向用户那里,它不是,重定向别的东西。

App.js-包装

import React, { useEffect } from "react";
...
useEffect(() => {
if (cookies["_sf-jwt"]) dispatch(setToken(cookies["sf-jwt"])); // this works, state is really updated, but...
}, []);
...

当我必须访问受保护的路线时,其中部分状态是必要的,例如isUser = false / true,首先在受保护的路由和她的组件中安装了什么,而不是来自父组件(上面的App.js)的useEffect,因此,我得到了第一个随叫随到的旧默认状态,在那里我不能允许用户进入页面,之后,来自App.js的useEffect工作,状态更新,但为时已晚,我受保护的组件不知道?

Protected.js

...
const user = useSelector(currentUser); // init state from redux
...
render={() => {
return user.currentUser.loggined ? (  // user.currentUser.loggined is false on init
children
) : (
<Redirect to="/register"></Redirect>
);
}}
...

我的问题是,为什么和如何?

我找到了一个解决方案,从useEffect中逃脱,把逻辑放在组件的顶部,现在我想怎么工作。

我的解决方案是安全的,我可以做上面这样的事情(将来从useEffect转义?),对redux是安全的吗?

我的建议是在您的App.js中有一个额外的状态变量,您检查您的用户是否已登录。然后,只有当你知道你检查了用户的状态时,才渲染路由器。这样,例如Protected.js页面将始终具有正确的用户状态。

const App = () => {
const [authChecked, setAuthChecked] = useState(false)
useEffect(() => {
if (cookies["_sf-jwt"]) {
dispatch(setToken(cookies["sf-jwt"]))
}
setAuthChecked(true)
}, [])
return authChecked ? <Router /> : <Loader />
}

您提到了redux,它存储用户对象。在我看来,你可能会使用一些redux中间件来检查cookie并填充用户状态,也许在那里触发这样的操作onload并检查cookie是一个好主意,如果它们存在-填充用户状态,否则调用路由器的.push()或.redirect()方法。(只是大声地想):

相关内容

  • 没有找到相关文章