我已经尝试根据用户检查进行路由,但是我做了,但是我的方法工作了两次。我从我的日志中了解它
我正在使用redux,这是mainrouter.js中的“ useeffect”
// currentUser : null // in initialState for users
useEffect(() => {
if(states.currentUser== null)
{
console.log("Checking user for routing");
actions.getCurrentUserACT();
}
else{
console.log("Logged in")
}
},[]);
我的mainrouter.js返回
return (
<NavigationContainer>
{
states.currentUser == null ?
(this.SignStackScreen()) :
(this.MainTabNavigator())
}
</NavigationContainer>
);
这是我在redux操作中的“ getCurrentUserAct”方法
export function getCurrentUserACT() {
return function (dispatch) {
firebase.auth().onAuthStateChanged(user => {
if (user) {
console.log("User authed..");
dispatch({type:actionTypes.CURRENT_USER,payload:user})
} else {
console.log("User notauthed..");
dispatch({type:actionTypes.CURRENT_USER,payload:null})
}
});
}
当我的应用启动时,日志是..(如果我之前登录过)
我认为其原因是,useeffect首次起作用,并且状态改变了,用于返回和重新呈现”但后来我撤消了条件,日志是一样的。
所以我如何避免这种情况?有没有一种方法可以从useeffect之前运行方法并避免第二次渲染?或等待数据生效?
您的代码看起来正确,由于useEffect,没有理由记录两次,因为您将它用作componentDidMount,因此被称为一次。
记录两次的原因是此代码段:
firebase.auth().onAuthStateChanged(user => {
这里onAuthStateChanged是回调,在Firebase上身份验证状态更改时调用。如果要检查用户是否已登录,则需要避免执行以下操作]
if (user) { }
请尝试console.log(user)并检查用户在两次登录时是否保持相同。我相信用户内部属性将被更改。
希望这有助于您理解