【问题标题】:Conditional routing with ReactRouter in React在 React 中使用 ReactRouter 进行条件路由
【发布时间】:2020-11-10 06:58:29
【问题描述】:

class Login extends Component {
  async handle_login(e) {
    e.preventDefault();
    this.props.history.push('/home')
  }
  render() {
    return (     
      <input type='submit' value='Log in' onSubmit={(e)=>this.handle_login(e)}></input>
      <input type='submit'value='Sign up' onSubmit={(e)=>this.handle_signup(e)}></input>
    );
  }
}
export default withRouter(Login)
class App extends Component {
  // app.js

 render() {
 
return (
    <Router> 
      <div className='App' style={{marginTop:'0px'}}>
        <div className='container'>
          <Header></Header>
            
        <Route exact style={{marginTop:'0px'}} path='/' render={(props)=>(
  
   <div style={{display:'flex',justifyContent:'center'}}>
     {/* add  a  background in this div */}
   <Link to='/login' style={{color:'#000000', fontSize:'large',paddingRight:'10px' }}> Login </Link>
   
   <Link to='/' style={{color:'#000000', fontSize:'large' }}> Index </Link>
   </div>


)}></Route>


  <Route exact path='/home' component={Home}></Route>
  <Route  exact path='/login' component={Login}></Route>
  </div>   
  </div>  
       </Router>
  );
 }}
 export default App;

我正在尝试使用上述代码使用 withRouter 将“登录”组件重定向到“/home”,但运行代码什么也不做,也不会引发任何错误。我已经附上了 home 和登录组件。

【问题讨论】:

  • console.log(this.props.history) 如果您有任何问题,请告诉我们
  • 我尝试在“handle_login”函数中使用console.log(this.props.history) 记录历史记录,但控制台上没有任何记录。@BARNOWL
  • 试试console.log(this.props)
  • 我在“handle_login”函数中尝试了console.log(this.props),但控制台上没有渲染任何内容。@BARNOWL
  • 我在render方法中使用console.log(this.props)渲染了道具,道具确实包含history属性。@BARNOWL

标签: javascript reactjs react-router-v4


【解决方案1】:

主要问题可能是因为您忘记了构造函数来获取道具和bind your method

将您的课程更新为此

class Login extends Component {
  constructor(props) {
    super(props);

    // This binding is necessary to make `this` work in the callback
    this.handle_login = this.handle_login.bind(this);
  }
  
  // No "async" need here
  handle_login(e) {
    e.preventDefault();
    this.props.history.push('/home')
  }
  render() {
    return (     
      <input type='submit' value='Log in' onSubmit={(e)=>this.handle_login(e)}></input>
      <input type='submit'value='Sign up' onSubmit={(e)=>this.handle_signup(e)}></input>
    );
  }
}

export default withRouter(Login)

我还建议将您的方法传递给onSubmit 句柄,而不是在那里创建一个新函数:

<input type='submit' value='Log in' onSubmit={this.handle_login}></input>

更新

我还注意到您有 2 个 submit 类型的输入,这并不常见。您的操作也在onSubmit 中,而不是onClick,但您没有&lt;form&gt;,这通常是触发submit 函数的原因。

我的建议是同时检查您的 HTML 结构并确保它有意义。现在,试试这个至少让你的方法工作:

render() {
  // buttons have type="submit" by default, so no need to include that
  return (
    <button value='Log in' onClick={(e)=>this.handle_login(e)}></input>
  );
}

有一个有趣的讨论here,作为补充参考。

【讨论】:

  • 我尝试了如图所示的绑定,但没有成功。@BrunoMonteiro
  • 即使将方法传递给onSubmit 也不起作用。@BrunoMonteiro
  • 我更新了我的答案,请检查是否有帮助。评论信息太多,所以更新答案更容易:)
  • 感谢您的更新,但恐怕既没有将输入标签包装在表单元素中,也没有使用如图所示的按钮标签,我认为app.js 文件有问题,它因此我在问题中添加了,你能看看吗?@BrunoMonteiro
【解决方案2】:

@BrunoMonteiro 是正确的,但有一个替代选项,您可以将函数声明为箭头函数,这样您就不必绑定

class Login extends Component {
  constructor(props) {
    super(props);
  }
  
  
  handle_login=async(e)=> {
    e.preventDefault();
    this.props.history.push('/home')
  }
  render() {
    return (     
      <input type='submit' value='Log in' onClick={(e)=>this.handle_login(e)}></input>
      <input type='submit'value='Sign up' onClick={(e)=>this.handle_signup(e)}></input>
    );
  }
}

export default withRouter(Login)

还要确保您可以访问 props 中的 history 属性以检查这一点,您可以执行 console.log(this.props) 并检查它是否具有必需的属性

【讨论】:

  • 感谢您的回答,我尝试记录道具,道具确实包含历史属性,但仍然无法使代码工作。@Anku
  • 我怀疑您没有获得历史属性,因为您使用的是 react-router 4.0.0 及更高版本,并且在 4.0.0 或更高版本中进行了一些更改,请查看此链接 stackoverflow.com/questions/42857283/… 和在路由文件中进行相应的更改,看看它是否有效@Arshagarwal
  • 实际上我已经在您提到的链接中说明的代码中通过别名Router 使用BrowserRouter。@Anku
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2018-12-12
相关资源
最近更新 更多