【问题标题】:redirect in react router failed to render component反应路由器中的重定向无法渲染组件
【发布时间】:2018-08-23 18:28:30
【问题描述】:

该组件应该在登录后重定向到主页,但之前它工作过,然后突然它根本不起作用,重定向继续回到root('/')

这是 index.js 中的代码(我使用的是 material-kit 主题):

import React from "react";
import ReactDOM from "react-dom";
import { createBrowserHistory } from "history";
import { Router, Route, Switch } from "react-router";
import indexRoutes from "routes/index.jsx";
import "assets/scss/material-kit-react.css?v=1.1.0";

var hist = createBrowserHistory();

ReactDOM.render(
    <Router history={hist}>
      <Switch>
        {indexRoutes.map((prop, key) => {
          return <Route path={prop.path} key={key} component= 
{prop.component} />;
        })}
      </Switch>
    </Router>,
  document.getElementById("root")
);

这里是 index.jsx 里面

var indexRoutes = [
  { path: "/login-page", name: "LoginPage", component: LoginPage },
  { path: "/register-page", name: "RegisterPage", component: RegisterPage },
  { path: "/home-page", name: "HomePage", component: Home},
  { path: "/", name: "LandingPage", component: LandingPage  }

];

export default indexRoutes;

这里是登录页面

class LoginPage extends React.Component {
  constructor() {
    super();
    this.state = {
      cardAnimaton: "cardHidden",
      signInEmail: "",
      signInPassword: "",
      isSignIn: false,
      errorLogin: "",
      user: {
        id: "",
        name: "",
        email: "",
        joined: ""
      }
    };
  }

  //load user
  loadUser = (data) => {
    // update user
    this.setState({
      user: {
        id: data.id,
        name: data.name,
        email: data.email,
        joined: data.joined
      }
    })
  }


  onEmailChange = (event) => {
    this.setState({ signInEmail : event.target.value})
  }

  onPasswordChange = (event) => {
    this.setState({ signInPassword : event.target.value})
  }

  //submit change
  onSubmitSignIn = () => {
    fetch('http://localhost:3001/signin', {
      method: 'post',
      headers: {'Content-Type' : 'application/json'},
      body: JSON.stringify({
        email: this.state.signInEmail,
        password: this.state.signInPassword
      })
    })
      .then(response => response.json())
      .then( user => {
        if(user.id){
          this.loadUser(user)
          this.setState({ isSignIn: true})
        }else{
          this.setState({ errorLogin: "Please check your email and password"})
        }
      })
  }

  render() {
    const { classes, ...rest } = this.props;
    const { errorLogin } = this.state;

    if( this.state.isSignIn === true){
      return <Redirect 
      to="/home-page" />
    }

    return (
      <div>
        <div
          className={classes.pageHeader}
        >
         <Particles className={classes.particles}
          params={ particlesOptions}
          /> 
          <div className={classes.container}>
            <GridContainer justify="center">
              <GridItem xs={12} sm={12} md={4}>
                <Card className={classes[this.state.cardAnimaton]}>
                  <form className={classes.form}>
                    <CardHeader className={classes.cardHeader}>
                      <h3>Login</h3>
                    </CardHeader>

                    <CardBody className={classes.cardbody}>
                      <FormControl fullWidth className={classes.signinform}>
                        <InputLabel htmlFor="email-address">Email</InputLabel>
                        <Input

                          type="email"
                          name="email-address"
                          id="email-address"
                          onChange={this.onEmailChange}
                          endAdornment={
                            <InputAdornment position="end">
                              <Email className={classes.inputIconsColor}/>
                            </InputAdornment>
                          }
                        />
                        <InputLabel htmlFor="password" className={classes.passwordlabel}>Password</InputLabel>
                        <Input
                          type="password"
                          name="password"
                          id="password"
                          onChange={this.onPasswordChange}
                          endAdornment={
                            <InputAdornment position="end">
                              <LockOutline className={classes.inputIconsColor}/>
                            </InputAdornment>
                          }
                        />
                      </FormControl>
                    </CardBody>
                    {(errorLogin) ? 
                      <SnackbarContent 
                        message={errorLogin}
                        className={classNames(classes.root, classes.message)}
                      /> 
                      : "" 
                    }

                    <CardFooter className={classes.cardFooter}>
                    <p className={classes.divider}>Don't have an account?
                    <Link to='/register-page'>
                    Register
                    </Link>
                    </p>
                    <div className={classes.buttonplace}>
                      <Button className={classes.buttonsingin} size="sm" onClick={this.onSubmitSignIn} >

                        Sign In
                      </Button>
                    </div>
                    </CardFooter>

                  </form>
                </Card>
              </GridItem>
            </GridContainer>

          </div>
        </div>
      </div>
    );
  }
}

当我直接尝试它时它工作但在登录页面尝试这样做后路径更改为/home-page一会儿然后返回/,我不知道为什么它突然不起作用,因为它之前工作过,有没有错误

【问题讨论】:

  • 安装了什么版本的 react-router?
  • @azium react router v4
  • 您的代码看起来像是 3 和 4 的奇怪组合。v4 有 react-router-dom 并直接导出路由器,无需将历史传递给它
  • @azium 这是我使用材料套件主题时的默认设置。在此之前我没有遇到任何问题,当我尝试登录路径更改片刻然后再次返回“/”时,即使我尝试仅以更简单的方式渲染组件

标签: reactjs react-router react-router-v4


【解决方案1】:

如果它带您到Landing Page 组件,无论您输入哪条路线。您必须在路线中使用exact。在您的情况下,它始终呈现 "/"corresponding 组件。 试试这个:

 <Router history={hist}>
  <Switch>
    {indexRoutes.map((prop, key) => {
      return <Route exact path={prop.path} key={key} component= 
       {prop.component} />;
    })}
  </Switch>
</Router>,

如果问题仍然存在,请告诉我。很乐意为此提供帮助。

【讨论】:

  • 当我不尝试传递状态前 &lt;Redirect to={{pathname: "/home-page"}}/&gt; 时它工作正常,但只要我传递状态 &lt;Redirect to={{pathname: "/home-page", state: {id: id}}} /&gt; 它就会回到根目录
【解决方案2】:

这是一个愚蠢的错误和&lt;Redirect/&gt; 的问题,在我的主组件中,有一个带有重定向组件的标题应该返回到根页面(用于注销),所以每次我尝试渲染 /home 它总是触发那&lt;Redirect/&gt;

【讨论】:

    猜你喜欢
    • 2021-09-06
    • 2020-07-05
    • 2019-03-02
    • 1970-01-01
    • 2017-12-23
    • 2018-07-26
    • 2022-10-23
    • 2019-04-25
    • 2019-11-29
    相关资源
    最近更新 更多