我尝试使应用程序重定向到登录页面,如果用户没有登录,这是我的PrivateRoute:
export const PrivateRoute = ({ component: Component, ...rest }) => {
    return (
        <Route {...rest} render={props => (
            !authService.currentUserValue ?
                <Redirect to={{pathname: '/login', state: {from: props.location}}}/>
                :
                <Component {...props} />
        )}/>
    );
}这是我的应用渲染:
 render() {
    const { currentUser } = this.state;
    return (
        <Router history={history}>
            <div>
              <PrivateRoute exact path="/" component={Dashboard} />
              <Route path="/login" component={LoginPage} />
            </div>
        </Router>
    );
  }这是我的登录页面:
class LoginPage extends Component {
    constructor(props) {
        super(props);
        if (authService.currentUserValue) {
            this.props.history.push('/');
        }
    }
    render() {
        const { classes } = this.props;
        return (
            <Container component="main" maxWidth="xs">
                <CssBaseline/>
                <div className={classes.paper}>
                    <Avatar className={classes.avatar}>
                        <LockOutlinedIcon/>
                    </Avatar>
                    <Typography component="h1" variant="h5">
                        Sign in
                    </Typography>
                    <Formik
                        initialValues={{
                            username: '',
                            password: ''
                        }}
                        /*validationSchema={Yup.object().shape({
                            username: Yup.string().required('Username is required'),
                            password: Yup.string().required('Password is required')
                        })}*/
                        onSubmit={({username, password}, {setStatus, setSubmitting}) => {
                            setStatus();
                            authService.login(username, password)
                                .then(
                                    user => {
                                        const {from} = this.props.location.state || {from: {pathname: "/"}};
                                        this.props.history.push(from);
                                    },
                                    error => {
                                        setSubmitting(false);
                                        setStatus(error);
                                    }
                                );
                        }}
                        render={({errors, status, touched, isSubmitting}) => (
                            <Form className={classes.form}>
                                <TextField
                                    variant="outlined"
                                    margin="normal"
                                    required
                                    fullWidth
                                    id="username"
                                    label="Username"
                                    name="username"
                                    autoComplete="username"
                                    autoFocus
                                    error={(errors.username && touched.username)}
                                />
                                <ErrorMessage name="username" component="div" className="invalid-feedback" />
                                <TextField
                                    variant="outlined"
                                    margin="normal"
                                    required
                                    fullWidth
                                    name="password"
                                    label="Password"
                                    type="password"
                                    id="password"
                                    autoComplete="current-password"
                                    error={(errors.password && touched.password)}
                                />
                                <ErrorMessage name="password" component="div" className="invalid-feedback" />
                                <FormControlLabel
                                    control={<Checkbox value="remember" color="primary"/>}
                                    label="Remember me"
                                />
                                <br />
                                {
                                    isSubmitting
                                    &&
                                    <img src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
                                }
                                <Button
                                    type="submit"
                                    fullWidth
                                    variant="contained"
                                    color="primary"
                                    className={classes.submit}
                                    disabled={isSubmitting}
                                >
                                    Sign In
                                </Button>
                                <Grid container>
                                    <Grid item xs>
                                        <Link href="#" variant="body2">
                                            Forgot password?
                                        </Link>
                                    </Grid>
                                    <Grid item>
                                        <Link href="#" variant="body2">
                                            {"Don't have an account? Sign Up"}
                                        </Link>
                                    </Grid>
                                </Grid>
                                {status && <div className={'alert alert-danger'}>{status}</div>}
                            </Form>
                        )}
                    />
                </div>
            </Container>
        )
    }
}当privateRoute重定向到登录页面(/login)时,我看不到任何东西,但如果我刷新页面(/login),它将显示我的登录表单。
我试着改变我构建组件的方式,但是没有成功。
为什么?
历史版本改为4.10.1已解决。这篇博客提供了帮助:https://jasonwatmore.com/post/2020/10/22/react-router-v5-fix-for-redirects-not-rendering-when-using-custom-history
tnx
发布于 2020-11-20 23:43:15
在应用程序内部将<div>替换为<Switch>
https://stackoverflow.com/questions/64932277
复制相似问题