How to push to History in React Router v4?

后端 未结 21 1851
不思量自难忘°
不思量自难忘° 2020-11-22 00:27

In the current version of React Router (v3) I can accept a server response and use browserHistory.push to go to the appropriate response page. However, this isn

相关标签:
21条回答
  • 2020-11-22 01:17

    This is how I did it:

    import React, {Component} from 'react';
    
    export default class Link extends Component {
        constructor(props) {
            super(props);
            this.onLogout = this.onLogout.bind(this);
        }
        onLogout() {
            this.props.history.push('/');
        }
        render() {
            return (
                <div>
                    <h1>Your Links</h1>
                    <button onClick={this.onLogout}>Logout</button>
                </div>
            );
        }
    }
    

    Use this.props.history.push('/cart'); to redirect to cart page it will be saved in history object.

    Enjoy, Michael.

    0 讨论(0)
  • 2020-11-22 01:18

    you can use it like this as i do it for login and manny different things

    class Login extends Component {
      constructor(props){
        super(props);
        this.login=this.login.bind(this)
      }
    
    
      login(){
    this.props.history.push('/dashboard');
      }
    
    
    render() {
    
        return (
    
       <div>
        <button onClick={this.login}>login</login>
        </div>
    
    )
    
    0 讨论(0)
  • 2020-11-22 01:19

    In this case you're passing props to your thunk. So you can simply call

    props.history.push('/cart')
    

    If this isn't the case you can still pass history from your component

    export function addProduct(data, history) {
      return dispatch => {
        axios.post('/url', data).then((response) => {
          dispatch({ type: types.AUTH_USER })
          history.push('/cart')
        })
      }
    }
    
    0 讨论(0)
  • 2020-11-22 01:20

    this.context.history.push will not work.

    I managed to get push working like this:

    static contextTypes = {
        router: PropTypes.object
    }
    
    handleSubmit(e) {
        e.preventDefault();
    
        if (this.props.auth.success) {
            this.context.router.history.push("/some/Path")
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 01:22

    If you are using Redux, then I would recommend using npm package react-router-redux. It allows you to dispatch Redux store navigation actions.

    You have to create store as described in their Readme file.

    The easiest use case:

    import { push } from 'react-router-redux'
    
    this.props.dispatch(push('/second page'));
    

    Second use case with Container/Component:

    Container:

    import { connect } from 'react-redux';
    import { push } from 'react-router-redux';
    
    import Form from '../components/Form';
    
    const mapDispatchToProps = dispatch => ({
      changeUrl: url => dispatch(push(url)),
    });
    
    export default connect(null, mapDispatchToProps)(Form);
    

    Component:

    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    
    export default class Form extends Component {
      handleClick = () => {
        this.props.changeUrl('/secondPage');
      };
    
      render() {
        return (
          <div>
            <button onClick={this.handleClick}/>
          </div>Readme file
        );
      }
    }
    
    0 讨论(0)
  • 2020-11-22 01:23

    Here's my hack (this is my root-level file, with a little redux mixed in there - though I'm not using react-router-redux):

    const store = configureStore()
    const customHistory = createBrowserHistory({
      basename: config.urlBasename || ''
    })
    
    ReactDOM.render(
      <Provider store={store}>
        <Router history={customHistory}>
          <Route component={({history}) => {
            window.appHistory = history
            return (
              <App />
            )
          }}/>
        </Router>
      </Provider>,
      document.getElementById('root')
    )
    

    I can then use window.appHistory.push() anywhere I want (for example, in my redux store functions/thunks/sagas, etc) I had hoped I could just use window.customHistory.push() but for some reason react-router never seemed to update even though the url changed. But this way I have the EXACT instance react-router uses. I don't love putting stuff in the global scope, and this is one of the few things I'd do that with. But it's better than any other alternative I've seen IMO.

    0 讨论(0)
提交回复
热议问题