How to do a redirect to another route with react-router?

前端 未结 6 2193
眼角桃花
眼角桃花 2020-12-07 13:37

I am trying to do A SIMPLE using react-router ( version ^1.0.3 ) to redirect to another view and I am just getting tired.

import React from          


        
相关标签:
6条回答
  • 2020-12-07 13:59

    For the simple answer, you can use Link component from react-router, instead of button. There is ways to change the route in JS, but seems you don't need that here.

    <span className="input-group-btn">
      <Link to="/login" />Click to login</Link>
    </span>
    

    To do it programmatically in 1.0.x, you do like this, inside your clickHandler function:

    this.history.pushState(null, 'login');

    Taken from upgrade doc here

    You should have this.history placed on your route handler component by react-router. If it child component beneath that mentioned in routes definition, you may need pass that down further

    0 讨论(0)
  • 2020-12-07 14:09

    Easiest solution for web!

    Up to date 2020
    confirmed working with:

    "react-router-dom": "^5.1.2"
    "react": "^16.10.2"
    

    Use the useHistory() hook!

    import React from 'react';
    import { useHistory } from "react-router-dom";
    
    
    export function HomeSection() {
      const history = useHistory();
      const goLogin = () => history.push('login');
    
      return (
        <Grid>
          <Row className="text-center">          
            <Col md={12} xs={12}>
              <div className="input-group">
                <span className="input-group-btn">
                  <button onClick={goLogin} type="button" />
                </span>
              </div>
            </Col>
          </Row>
        </Grid>
      );
    }
    
    0 讨论(0)
  • 2020-12-07 14:18

    The simplest solution is:

    import { Redirect } from 'react-router';
    
    <Redirect to='/componentURL' />
    
    0 讨论(0)
  • 2020-12-07 14:21

    1) react-router > V5 useHistory hook:

    If you have React >= 16.8 and functional components you can use the useHistory hook from react-router.

    import React from 'react';
    import { useHistory } from 'react-router-dom';
    
    const YourComponent = () => {
        const history = useHistory();
    
        const handleClick = () => {
            history.push("/path/to/push");
        }
    
        return (
            <div>
                <button onClick={handleClick} type="button" />
            </div>
        );
    }
    
    export default YourComponent;
    

    2) react-router > V4 withRouter HOC:

    As @ambar mentioned in the comments, React-router has changed their code base since their V4. Here are the documentations - official, withRouter

    import React, { Component } from 'react';
    import { withRouter } from "react-router-dom";
    
    class YourComponent extends Component {
        handleClick = () => {
            this.props.history.push("path/to/push");
        }
    
        render() {
            return (
                <div>
                    <button onClick={this.handleClick} type="button">
                </div>
            );
        };
    }
    
    export default withRouter(YourComponent);
    

    3) React-router < V4 with browserHistory

    You can achieve this functionality using react-router BrowserHistory. Code below:

    import React, { Component } from 'react';
    import { browserHistory } from 'react-router';
    
    export default class YourComponent extends Component {
        handleClick = () => {
            browserHistory.push('/login');
        };
    
        render() {
            return (
                <div>
                    <button onClick={this.handleClick} type="button">
                </div>
            );
        };
    }
    

    4) Redux connected-react-router

    If you have connected your component with redux, and have configured connected-react-router all you have to do is this.props.history.push("/new/url"); ie, you don't need withRouter HOC to inject history to the component props.

    // reducers.js
    import { combineReducers } from 'redux';
    import { connectRouter } from 'connected-react-router';
    
    export default (history) => combineReducers({
        router: connectRouter(history),
        ... // rest of your reducers
    });
    
    
    // configureStore.js
    import { createBrowserHistory } from 'history';
    import { applyMiddleware, compose, createStore } from 'redux';
    import { routerMiddleware } from 'connected-react-router';
    import createRootReducer from './reducers';
    ...
    export const history = createBrowserHistory();
    
    export default function configureStore(preloadedState) {
        const store = createStore(
            createRootReducer(history), // root reducer with router state
            preloadedState,
            compose(
                applyMiddleware(
                    routerMiddleware(history), // for dispatching history actions
                    // ... other middlewares ...
                ),
            ),
        );
    
        return store;
    }
    
    
    // set up other redux requirements like for eg. in index.js
    import { Provider } from 'react-redux';
    import { Route, Switch } from 'react-router';
    import { ConnectedRouter } from 'connected-react-router';
    import configureStore, { history } from './configureStore';
    ...
    const store = configureStore(/* provide initial state if any */)
    
    ReactDOM.render(
        <Provider store={store}>
            <ConnectedRouter history={history}>
                <> { /* your usual react-router v4/v5 routing */ }
                    <Switch>
                        <Route exact path="/yourPath" component={YourComponent} />
                    </Switch>
                </>
            </ConnectedRouter>
        </Provider>,
        document.getElementById('root')
    );
    
    
    // YourComponent.js
    import React, { Component } from 'react';
    import { connect } from 'react-redux';
    ...
    
    class YourComponent extends Component {
        handleClick = () => {
            this.props.history.push("path/to/push");
        }
    
        render() {
            return (
              <div>
                <button onClick={this.handleClick} type="button">
              </div>
            );
          }
        };
    
    }
    
    export default connect(mapStateToProps = {}, mapDispatchToProps = {})(YourComponent);
    
    0 讨论(0)
  • 2020-12-07 14:21

    With react-router v2.8.1 (probably other 2.x.x versions as well, but I haven't tested it) you can use this implementation to do a Router redirect.

    import { Router } from 'react-router';
    
    export default class Foo extends Component {
    
      static get contextTypes() {
        return {
          router: React.PropTypes.object.isRequired,
        };
      }
    
      handleClick() {
        this.context.router.push('/some-path');
      }
    }
    
    0 讨论(0)
  • 2020-12-07 14:26

    How to do a redirect to another route with react-router?

    For example, when a user clicks a link <Link to="/" />Click to route</Link> react-router will look for / and you can use Redirect to and send the user somewhere else like the login route.

    From the docs for ReactRouterTraining:

    Rendering a <Redirect> will navigate to a new location. The new location will override the current location in the history stack, like server-side redirects (HTTP 3xx) do.

    import { Route, Redirect } from 'react-router'
    
    <Route exact path="/" render={() => (
      loggedIn ? (
        <Redirect to="/dashboard"/>
      ) : (
        <PublicHomePage/>
      )
    )}/>
    

    to: string, The URL to redirect to.

    <Redirect to="/somewhere/else"/>
    

    to: object, A location to redirect to.

    <Redirect to={{
      pathname: '/login',
      search: '?utm=your+face',
      state: { referrer: currentLocation }
    }}/>
    
    0 讨论(0)
提交回复
热议问题