Реактив-роутер подключен к избыточному: работает со ссылками, но только изменение URL при отправке push
Я пытаюсь программно выдвинуть URL-адрес для навигации по реагирующему маршрутизатору, редуксу и подключенному реагирующему маршрутизатору.
При нажатии на <Link />
кнопка работает отлично, URL меняется и маршрут тоже.
Но при использовании dispatch(push(url)
, URL только меняется, а контент не обновляется
Я сделал минимальный пример здесь.
Любая помощь будет очень благодарна,
Спасибо
2 ответа
Много антишаблонного кода, плохая структура приложений и смешивание пакетов сдерживают ваше приложение.
Я переписал это полностью, вот что я сделал:
- Переконфигурировал структуру папки вашего приложения, чтобы она была стандартной.
- Не смешивай
Router
(BrowserRouter
) сConnectedRouter
, - Не размещайте все свои
components
в пределахApp.js
файл. - Так как
Header
всегда установлен, вам не нужноredux
вместо этого вы можете просто использоватьwithRouter
(он выставляет реквизиты маршрута к компоненту). - Ваш
rootReducer
отсутствуетreducer
поэтому я добавилdummyReducer
это просто возвращаетstate
, - Придерживаться
Link
или жеthis.props.history
при навигации. Для этого примера нет необходимости использовать оба. Кроме того, вам не нужно использоватьConnectedRouter
"spush
функция, потому чтоhistory
передается как опора при использованииwithRouter
,
Примечание: если вы хотите Header
чтобы быть "маршрутизатором", через который проходят все изменения маршрута, вам нужно создать action
и reducer
который проходит string
и хранит его в редуксе store
, Header
затем connect
едет в магазин редуксов и обновляет route
когда это string
изменился
Рабочий пример: https://codesandbox.io/s/526p7kjqq4
компоненты /Header.js
import React, { PureComponent, Fragment } from "react";
import { withRouter } from "react-router-dom";
class Header extends PureComponent {
goTo = route => {
this.props.history.push(route);
};
render = () => (
<Fragment>
<ul>
<li>
<button onClick={() => this.goTo("/")}> Announcements </button>
</li>
<li>
<button onClick={() => this.goTo("/shopping")}> Shopping </button>
</li>
</ul>
<div>
<button onClick={() => this.goTo("/shopping")}>
Click here to go shopping ! (if you can...)
</button>
</div>
</Fragment>
);
}
export default withRouter(Header);
маршруты /index.js
import React from "react";
import { Switch, Route } from "react-router-dom";
import Announcements from "../components/annoucements";
import Shopping from "../components/shopping";
export default () => (
<div style={{ padding: "150px" }}>
<Switch>
<Route exact path="/" component={Announcements} />
<Route path="/shopping" component={Shopping} />
</Switch>
</div>
);
компоненты /App.js
import React, { Fragment } from "react";
import Routes from "../routes";
import Header from "./Header";
export default () => (
<Fragment>
<Header />
<Routes />
</Fragment>
);
Вот что вы пытаетесь сделать: https://codesandbox.io/s/8nmp95y8r2
Тем не менее, я не рекомендую это, так как это немного ненужно, когда history
либо уже передан в качестве опоры от Route
или может быть выставлен при использовании withRouter
, Согласно документации Redux, это тоже не рекомендуется. И вместо того, чтобы использовать Link
или передать history
опора к редуксу action
Создатель вместо программной навигации по избыточному состоянию.
Контейнеры /Header.js
import React, { PureComponent, Fragment } from "react";
import { connect } from "react-redux";
import { push } from "connected-react-router";
class Header extends PureComponent {
goTo = route => this.props.push(route); // this is equivalent to this.props.dispatch(push(route)) -- I'm just appending dispatch to the push function in the connect function below
render = () => (
<Fragment>
<ul>
<li>
<button onClick={() => this.goTo("/")}> Announcements </button>
</li>
<li>
<button onClick={() => this.goTo("/shopping")}> Shopping </button>
</li>
</ul>
<div>
<button onClick={() => this.goTo("/shopping")}>
Click here to go shopping ! (if you can...)
</button>
</div>
</Fragment>
);
}
export default connect(
null,
{ push }
)(Header);
Прочитав весь поток потем () рендеринг-маршрутизатора-редукса, не отображающий новый маршрут, я наткнулся на это решение: вам нужно использовать маршрутизатор с передачей истории в качестве опоры для вашего приложения и не использовать создание из нескольких файлов, просто импортируйте его из общего файла.
Вот рабочие коды andbox: push рендеринг нового маршрута