ReactJS Router V4 history.push не работает

Я обновился до React Router V4 и теперь борюсь с методом history.push.

У меня есть файл index.js:

import React from "react";
import { render } from "react-dom";
import { BrowserRouter, Route } from 'react-router-dom';
import createBrowserHistory from 'history/createBrowserHistory';

const history = createBrowserHistory();

import { Main} from "./components/Main";
import { About } from "./components/About";
import { Cars} from "./components/Cars";


class App extends React.Component {

render() {
    return (
        <BrowserRouter history={history}>

            <div>
                <Route path={"/"} component={Main} />
                <Route path={"/cars"} component={Cars}/>
                <Route path={"/about"} component={About}/>
            </div>
        </BrowserRouter>
    )
  }
}

render(<App/>, window.document.getElementById("app"));

А потом у меня есть еще один файл, где я добавил простой возврат на определенную страницу, которая выглядит так:

import React from "react";
import createBrowserHistory from 'history/createBrowserHistory';

const history = createBrowserHistory();

export class Cars extends React.Component {
  navigateBack() {
    history.push('/')
  }

  render() {
    return(
        <div>
            <h3>Overview of Cars</h3>
            <p>Model: </p>
            <button onClick={this.navigateBack} className="btn btn-primary">Back</button>
        </div>
    )
  }
}

Итак, я не могу понять, что здесь происходит не так. Когда я нажимаю на кнопку, URL-адрес меняется на /, но это все. Есть ли кто-нибудь, кто может мне помочь?

ИЗМЕНИТЬ

Я узнал, что это работает, когда я делаю это:

this.props.history.push('/home')

а также

<button onClick={this.onNavigateHome.bind(this)}

а вроде как-то не так??

когда я делаю

this.context.history.push('/home')

Я получаю Cannot read property 'context' of null, но почему?? Моя настройка <BrowserRouter> неверна??

В любом случае спасибо за помощь :)


person ST80    schedule 07.04.2017    source источник
comment
BrowserRouter по умолчанию имеет неявную историю. Вместо этого вам нужно использовать Router. Ссылка: reacttraining.com/react-router/web/api/Router   -  person Adriano    schedule 28.06.2017
comment
Для React Router V4 вы можете this.context.router.history.push('/url');   -  person Parthipan Subramaniam    schedule 06.09.2018


Ответы (4)


Вы должны импортировать {withRouter} from 'react-router-dom' и экспортировать свой класс таким образом

export default withRouter(Cars)

person Steven Daniel Anderson    schedule 14.08.2017
comment
Hoc withRouter был импортирован из react-router, а не react-router-dom. Проверьте withRouter для получения дополнительной информации. - person Slim; 21.09.2018

Попробуйте добавить forceRefresh={true} в свой BrowserRouter.

<BrowserRouter forceRefresh={true}>
person Novia Lim    schedule 04.10.2017
comment
Вероятно, это не очень хороший подход, но не уверен, почему. - person Android; 28.04.2021

В версии 4 вы должны использовать this.context.history.push('/cart');
дополнительные сведения см. в следующих сообщениях:

Как отправить историю в React Router v4?

history.push не работает при использовании BrowserRouter

person paul    schedule 07.04.2017
comment
Странно - это не сработало, хотя мои исследования дали мне тот же ответ. Я нашел решение, но оно кажется неправильным. Я отредактировал свой пост, так что уточните. Может быть, вы знаете объяснение? - person ST80; 10.04.2017
comment
Я работаю с v4 и у меня нет this.context.history. - person Mikhail Batcer; 20.06.2018

Попробуйте использовать историю из реквизита и убедитесь, что ваш экспорт обернут withRouter.

Ex:

this.props.history.push('/test')


export default withRouter(TestComponent)
person Codemaker    schedule 14.05.2021