[英]react-router connected to redux : works with links but only the URL change when dispatching push
我正在尝试以编程方式推送URL以使用react-router,redux和connected-react-router进行导航
单击<Link />
按钮时,它工作正常,URL正在变化,路径也在变化。
但是当使用dispatch(push(url))
,URL只会更改,内容不会更新
我在这里做了一个小例子。
任何帮助都会非常感激,
谢谢
许多反模式代码,糟糕的应用程序结构以及包的混合都会阻碍您的应用程序。
我完全重写了这个,这就是我所做的:
Router
( BrowserRouter
)与ConnectedRouter
混合使用。 components
放在App.js
文件中。 Header
总是被挂载,所以你不需要redux
,而只需使用withRouter
(它将路径道具暴露给组件)。 rootReducer
缺少一个reducer
,所以我添加了一个只返回state
的dummyReducer
。 Link
或this.props.history
。 对于此示例,不需要同时使用两者。 此外,您不需要使用ConnectedRouter
的push
功能,因为在使用withRouter
时history
作为道具传递。 旁注:如果您希望Header
成为所有路径更改通过的“路由器”,那么您需要创建一个action
和一个传递string
并将其存储到redux store
的reducer
。 然后connect
Header
connect
到redux存储,并在此string
更改时更新route
。
工作示例: 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
道具传递给redux action
创建者而不是通过redux状态进行编程导航。
集装箱/ 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);
在阅读完整的线程react-router-redux的push()没有呈现新路由之后 ,我遇到了这个解决方案,您需要使用路由器将历史记录作为支撑下传到您的应用程序,并且不要使用来自多个文件的创建只需导入它来自一个普通文件。
这是工作代码框: 推送渲染新路线
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.