重定向到ReactJS的上一页

约瑟夫

由于执行检查,我在重定向到上一页时遇到问题isLoggedIn现在的问题是检查后将isLoggedIn其重定向到默认路由。如何维护我所在的页面?我现在所做的是使用,referer但未定义。请帮我找到另一种方法。请在下面检查我的代码:

Login.js

const Form = (props) => {
    const classes = useStyles();
    const isLoggedIn = useSelector((state) => state.auth.isLoggedIn);
    const referer = props.referer;
    const history = useHistory();

    console.log(history);

    const { values, touched, errors, isSubmitting, handleChange, handleBlur, handleSubmit } = props;

    if (isLoggedIn) {
      return <Redirect to={referer} />;
    }

    return (
      <div className={classes.root}>
        <Grid container direction="row" justify="center">
          <Grid item lg={4} md={5} xs={10}>
            <Card>
              <form onSubmit={handleSubmit}>
                <CardHeader
                  title="LOGIN"
                  classes={{
                    title: classes.cardHeader,
                  }}
                  className={classes.cardHeader}
                />

                <CardContent className={classes.textFieldSection}>
                  <TextField
                    fullWidth
                    label="Username"
                    name="username"
                    type="text"
                    variant="outlined"
                    value={values.username}
                    onChange={handleChange}
                    onBlur={handleBlur}
                    helperText={touched.username ? errors.username : ''}
                    error={touched.username && Boolean(errors.username)}
                    InputProps={{
                      endAdornment: (
                        <InputAdornment>
                          <AccountCircle />
                        </InputAdornment>
                      ),
                    }}
                  />
                  <TextField
                    fullWidth
                    label="Password"
                    name="password"
                    style={{ marginTop: '1rem' }}
                    type="password"
                    variant="outlined"
                    value={values.password}
                    onChange={handleChange}
                    onBlur={handleBlur}
                    helperText={touched.password ? errors.password : ''}
                    error={touched.password && Boolean(errors.password)}
                    InputProps={{
                      endAdornment: (
                        <InputAdornment>
                          <LockIcon />
                        </InputAdornment>
                      ),
                    }}
                  />
                </CardContent>

                <CardActions className={classes.loginButtonSection}>
                  <Button
                    type="submit"
                    color="primary"
                    variant="contained"
                    className={classes.loginButton}
                    disabled={isSubmitting}
                  >
                    Log In
                  </Button>
                </CardActions>

              </form>
            </Card>
          </Grid>
        </Grid>
      </div>
    );
  };

  let yup = require('yup');

  export const Login = (props) => {
    const dispatch = useDispatch();

    const MyFormWithFormik = withFormik({
      mapPropsToValues: ({ username, password }) => {
        return {
          username: username || '',
          password: password || '',
        };
      },
      validationSchema: yup.object().shape({
        username: yup.string().required('Enter your username'),
        password: yup.string().required('Enter your password'),
      }),
      handleSubmit: (values, { setSubmitting }) => {
        dispatch(login(values.username, values.password));
        setSubmitting(false);
      },
    })(Form);

    return <MyFormWithFormik />;
  };

  Form.propTypes = {
    className: PropTypes.string,
  };

  export default Login;

PrivateRoute.js

import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import axios from 'axios';
import { useSelector } from 'react-redux';

function PrivateRoute({ component: Component, ...rest }) {
  const authTokens = useSelector((state) => state.auth.access_token);

  function checkTokenExpiry() {
    if (authTokens) {
      axios.interceptors.request.use(
        function (config) {
          const token = `Bearer ${authTokens}`;
          config.headers.Authorization = token;
          console.log(config);
          return config;
        },
        (error) => {
          console.log(error);
          Promise.reject(error);
        }
      );
    }
  }

  if (authTokens != null) {
    checkTokenExpiry();
  }

  return (
    <Route
      {...rest}
      render={(props) =>
        authTokens ? (
          <Component {...props} />
        ) : (
          <Redirect to={{ pathname: '/login', state: { referer: props.location } }} />
        )
      }
    />
  );
}

export default PrivateRoute;

PrivateAdminOnlyRoute

import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import axios from 'axios';
import { useSelector } from 'react-redux';

function PrivateAdminOnlyRoute({ component: Component, ...rest }) {
  const authTokens = useSelector((state) => state.auth.access_token);
  const isAdmin = useSelector((state) => state.auth.is_admin);

  function checkTokenExpiry() {
    if (authTokens) {
      axios.interceptors.request.use(
        function (config) {
          const token = `Bearer ${authTokens}`;
          config.headers.Authorization = token;
          console.log(config);
          return config;
        },
        (error) => {
          console.log(error);
          Promise.reject(error);
        }
      );
    }
  }

  if (authTokens != null) {
    checkTokenExpiry();
  }

  return (
    <Route
      {...rest}
      render={(props) =>
        authTokens && isAdmin === true ? (
          <Component {...props} />
        ) : authTokens && (isAdmin === false || undefined || null) ? (
          <Redirect to={{ pathname: '/pending', state: { referer: props.location } }} />
        ) : (
          <Redirect to={{ pathname: '/login', state: { referer: props.location } }} />
        )
      }
    />
  );
}

export default PrivateAdminOnlyRoute;

Routes.js

import React, { useState } from 'react';
import { BrowserRouter as Router, Link, Route, Switch } from 'react-router-dom';
import PrivateRoute from './PrivateRoute';
import Login from './pages/Login/Login';
import Signup from './pages/Signup/Signup';
import Common from './pages/Common';

function Routes() {
  return (
    <Router>
      <Switch>
        <Route path="/login" component={Login} />
        <Route path="/signup" component={Signup} />
        <PrivateRoute path="/" component={Common} />
      </Switch>
    </Router>
  );
}

export default Routes;
aga井原里

使用state内部Redirect不是助手stateprops而是location


      import { useLocation } from 'react-router-dom';


      const location = useLocation();
      const referer = location.state && location.state.referer

关于您代码的另一件事(未直接与您的问题相关)是

(isAdmin === false || undefined || null)

isAdmin仅与进行比较false,以防万一isAdmin,不是false与进行比较undefined,而是undefined独立存在(具有虚假行为...),因此null

希望对您有所帮助:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何重定向到Aurelia中的上一页

重定向到PHP中的上一页

单击下一页/上一页或第二页时,codeigniter分页重定向到同一页

调用API并单击相同的ReactJS重定向到下一页

根据Laravel中的上一页重定向到其他页面

如何重定向到Angular 8中的上一页

POST请求后如何重定向到Django中的上一页

如何将用户重定向到单击编辑按钮的上一页

Spring-MVC控制器重定向到“上一页”页面?

控制器重定向到不同的路径,具体取决于上一页

重定向到带有附加参数的上一页

Symfony-如何将用户重定向到登录后访问的上一页?

Magento上的联系表单重定向到同一页面

如何从php中的登录页面重定向到“上一页和仪表板”

如何重定向到表单提交的另一页?

将一页重定向到http而不是https

如何从片段重定向到下一页

使用onclick()重定向到下一页

Django:HttpResponseRedirect不会重定向到下一页

仅将一页重定向到http htaccess

在`if`条件下重定向到另一页

重定向回上一页无法正常工作

从一页重定向到另一页时出现问题

如何从一页重定向到另一页

Django从一页重定向到另一页

将旧域的每个页面重定向到新域上的同一页面 URL

成功登录用户后,如何根据用户的上一页将其重定向到其他页面?

如何在没有http_refferer的情况下重定向到PHP中的上一页

使用MVC重定向到ASP.NET Core中的上一页URL-C#