What is the best way to redirect a page using React Router?

后端 未结 5 609
刺人心
刺人心 2020-11-28 20:43

I am new to React Router and learn that there are so many ways to redirect a page:

  1. Using browserHistory.push(\"/path\")

    import          
    
    
            
相关标签:
5条回答
  • 2020-11-28 21:00

    You can also use react router dom library useHistory;

    `
    import { useHistory } from "react-router-dom";
    
    function HomeButton() {
      let history = useHistory();
    
      function handleClick() {
        history.push("/home");
      }
    
      return (
        <button type="button" onClick={handleClick}>
          Go home
        </button>
      );
    }
    `
    

    https://reactrouter.com/web/api/Hooks/usehistory

    0 讨论(0)
  • 2020-11-28 21:01

    Now with react-router v15.1 and onwards we can useHistory hook, This is super simple and clear way. Here is a simple example from the source blog.

    import { useHistory } from "react-router-dom";
    
    function BackButton({ children }) {
      let history = useHistory()
      return (
        <button type="button" onClick={() => history.goBack()}>
          {children}
        </button>
      )
    }
    

    You can use this within any functional component and custom hooks. And yes this will not work with class components same as any other hook.

    Learn more about this here https://reacttraining.com/blog/react-router-v5-1/#usehistory

    0 讨论(0)
  • 2020-11-28 21:06

    You also can Redirect within the Route as follows. This is for handle invalid routes.

    <Route path='*' render={() => 
         (
           <Redirect to="/error"/>
         )
    }/>
    
    0 讨论(0)
  • 2020-11-28 21:14

    Actually it depends on your use case.

    1) You want to protect your route from unauthorized users

    If that is the case you can use the component called <Redirect /> and can implement the following logic:

    import React from 'react'
    import  { Redirect } from 'react-router-dom'
    
    const ProtectedComponent = () => {
      if (authFails)
        return <Redirect to='/login'  />
      }
      return <div> My Protected Component </div>
    }
    

    Keep in mind that if you want <Redirect /> to work the way you expect, you should place it inside of your component's render method so that it should eventually be considered as a DOM element, otherwise it won't work.

    2) You want to redirect after a certain action (let's say after creating an item)

    In that case you can use history:

    myFunction() {
      addSomeStuff(data).then(() => {
          this.props.history.push('/path')
        }).catch((error) => {
          console.log(error)
        })
    

    or

    myFunction() {
      addSomeStuff()
      this.props.history.push('/path')
    }
    

    In order to have access to history, you can wrap your component with an HOC called withRouter. When you wrap your component with it, it passes match location and history props. For more detail please have a look at the official documentation for withRouter.

    If your component is a child of a <Route /> component, i.e. if it is something like <Route path='/path' component={myComponent} />, you don't have to wrap your component with withRouter, because <Route /> passes match, location, and history to its child.

    3) Redirect after clicking some element

    There are two options here. You can use history.push() by passing it to an onClick event:

    <div onClick={this.props.history.push('/path')}> some stuff </div>
    

    or you can use a <Link /> component:

     <Link to='/path' > some stuff </Link>
    

    I think the rule of thumb with this case is to try to use <Link /> first, I suppose especially because of performance.

    0 讨论(0)
  • 2020-11-28 21:19

    One of the simplest way: use Link as follows:

    import { Link } from 'react-router-dom';
    
    <Link to={`your-path`} activeClassName="current">{your-link-name}</Link>
    
    

    If we want to cover the whole div section as link:

     <div>
         <Card as={Link} to={'path-name'}>
             .... 
               card content here
             ....
         </Card>
     </div>
    
    
    0 讨论(0)
提交回复
热议问题