gpt4 book ai didi

reactjs - React-Redux如何防止页面在重定向前渲染

转载 作者:行者123 更新时间:2023-12-03 13:36:34 27 4
gpt4 key购买 nike

我正在开发一个个人项目,但我无法检查用户是否已登录,因此当他们尝试访问/login 时,它会将他们重定向到主页。目前我的代码的作用如下:

  1. 定义了我自己的路线组件
  2. 调用 checkIfSignedIn 时,它会调度将 isLoggedIn 状态设置为 True 或 False 的操作。
  3. AuthenticatedRouter 组件会检查存储的 isLoggedIn 状态是 true 还是 false,然后渲染该组件或重定向到主页。
  4. 这可行,但问题是 isLoggedIn 最初为 false,因此如果他们登录,登录表单会显示一秒钟,然后在 isLoggedIn 变为 true 后重定向。

我不知道如何解决使用默认状态渲染组件然后由于状态更改而突然重定向的问题。谢谢

  • 我的用户帐户使用的是 firebase。

路由.js

const Routes = (props) => {
props.checkIfSignedIn();
return(
<Router>
<Switch>
<Route exact path='/' component={App}/>
<AuthorizedRoute path="/signup" component={SignUp}/>
<AuthorizedRoute path="/signin" component={SignIn}/>
<Route component={InvalidPage}/>
</Switch>
</Router>
);
};

const mapDispatchToProps = (dispatch) => {
return{
checkIfSignedIn: () => dispatch(checkIfSignedIn())
};
};

export default connect(null, mapDispatchToProps)(Routes);

AuthorizedRoute.js

class AuthorizedRoute extends React.Component{
constructor(props){
super(props);
this.state = {
isLoggedIn: false
};
};

render(){
const { component: Component, ...rest } = this.props;
return(
<Route {...rest} render={props => {
if (this.props.isLoggedIn){
console.log(this.state.isLoggedIn);
return <Redirect to="/" />
} else{
return <Component {...props} />
}
}} />
);
}
};


const mapStateToProps = (state) => {
return{
isLoggedIn : state.authentication.isLoggedIn
};
};

export default connect(mapStateToProps, null)(AuthorizedRoute);

authentication.js - 操作创建者

const setSignedInFalse = () => {
return{
type: IS_SIGNED_IN_FALSE
};
};

const setSignedInTrue = () => {
return{
type: IS_SIGNED_IN_TRUE
};
};

const checkIfSignedIn = () => {
return dispatch => {
firebaseApp.auth().onAuthStateChanged(user => {
if (user){
dispatch(setSignedInTrue());
} else{
dispatch(setSignedInFalse());
}
});
};
};

export default checkIfSignedIn;

authentication.js - reducer

const defaultState = {
isLoggedIn: false
};

const authentication = (state = defaultState, action) => {
let authenticationState = null;
switch (action.type){
case IS_SIGNED_IN_FALSE:
authenticationState = {
isLoggedIn: false
};
return authenticationState;
case IS_SIGNED_IN_TRUE:
authenticationState = {
isLoggedIn: true
};
return authenticationState;
default:
return state;
};
};

export default authentication;

Hacky 解决方案(不确定这是否会让人皱眉)。

我设置了 Auth reducer 的默认状态 isLoggedIn : null 而不是 false。然后,在我的 AuthorizedRoute 组件中,我现在有 3 个条件首先渲染 null,然后渲染组件或重定向。

//AuthorizedRoute Component
if (this.props.isLoggedIn){
return <Redirect to="/" />
} else if (this.props.isLoggedIn === false){
return <Component {...props} />
} else{
return null;
}

最佳答案

你可以做的是这样的:(在你的auth缩减程序中)。

let user = JSON.parse(localStorage.getItem('user'));
const initialState = user ? { isLoggedIn: true } : {};

此外,您还必须在用户登录时设置本地存储,并在用户注销时将其删除。

关于reactjs - React-Redux如何防止页面在重定向前渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47901695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com