React Router V4 正在更新 URL,但没有刷新(React、Redux)
React Router V4 is updating URL, but not refreshing (React, Redux)
我正在尝试使用 React-Router V4 将路由添加到我的应用程序,但它根本不起作用。基本上,我正在尝试使用 history.push
以编程方式更改路由,这会更新浏览器 URL,但不会更改实际应用程序中的任何内容。
注意:我使用的是 redux。
关于这个问题唯一回答的问题是:
但是,我已经尝试了上述问题的答案,但它对我不起作用。
以下是重要的片段:
最上面的文件 (index.js)
...
ReactDOM.render(
<BrowserRouter>
<Provider store={store}>
<App/>
</Provider>
</BrowserRouter>
, document.getElementById('root'));
...
包含路由的组件
...
export default function ContentRouter() {
return <div className="content">
<Route exact path="/dashboard" component={TmpDashboard}/>
<Route exact path="/" component={() => {
return <h1>Home</h1>
}}/>
</div>
}
组件推送路由
...
this.handleGroupClick = (group) => {
this.props.history.push(`/groups/${group}`);
this.props.onOpenChange(false);
};
...
export default withRouter(connect(mapStateToProps, mapDispatchToProps(DrawerConnector))
这是一个有效的设置:
主应用程序:
class App extends React.Component {
render() {
return (
<BrowserRouter>
<div>
/* this is a common component and happens to need to redirect */
<Route component={CommonComponentThatPushesToHistory} />
<div id="body">
/* I usually place this switch in a separate Routes file */
<Switch>
<Route exact path="FooRoute" component={FooPage}/>
<Route exact path="BarRoute" component={BarPage}/>
</Switch>
</div>
/* another common component which does not push to history */
<Footer />
</div>
</BrowserRouter>
);
}
}
export default withRouter(App);
CommonComponentThatPushesToHistory
class CommonComponentThatPushesToHistory extends React.Component{
render(){
return(
<button type="button"
onClick={() => {this.props.history.push('some-page');}}>
Click to get redirected</button>
);
}
}
FooPage 可能有一个推送到历史记录的子组件:
class FooPage extends React.Component{
render(){
return(
<MyChild history={this.props.history} />
);
}
}
然后 MyChild 组件可以像 CommonComponentThatPushesToHistory 一样推送到历史记录。
在完全错误的地方搜索了很多之后,我找出了错误的地方。缺少更新是由 Redux
引起的
每当组件被包裹在 connect
中时,它会导致更新被阻止,并且视图不会更新。
这里提到解决方法:
https://github.com/ReactTraining/react-router/issues/4671#issuecomment-285320076
基本上,每个内部有 Route
或 React-Router 东西的组件都必须用 withRouter
包裹起来
编辑:只有使用 connect
的顶级组件才应该包含在 withRouter
中。请注意,这可能会导致性能问题
编辑:我绕过耦合增加的方法是使用一个组件来处理路由。这样,我只需要包装那个组件,并用路由器包装该组件。
我正在尝试使用 React-Router V4 将路由添加到我的应用程序,但它根本不起作用。基本上,我正在尝试使用 history.push
以编程方式更改路由,这会更新浏览器 URL,但不会更改实际应用程序中的任何内容。
注意:我使用的是 redux。
关于这个问题唯一回答的问题是:
但是,我已经尝试了上述问题的答案,但它对我不起作用。
以下是重要的片段:
最上面的文件 (index.js)
...
ReactDOM.render(
<BrowserRouter>
<Provider store={store}>
<App/>
</Provider>
</BrowserRouter>
, document.getElementById('root'));
...
包含路由的组件
...
export default function ContentRouter() {
return <div className="content">
<Route exact path="/dashboard" component={TmpDashboard}/>
<Route exact path="/" component={() => {
return <h1>Home</h1>
}}/>
</div>
}
组件推送路由
...
this.handleGroupClick = (group) => {
this.props.history.push(`/groups/${group}`);
this.props.onOpenChange(false);
};
...
export default withRouter(connect(mapStateToProps, mapDispatchToProps(DrawerConnector))
这是一个有效的设置:
主应用程序:
class App extends React.Component {
render() {
return (
<BrowserRouter>
<div>
/* this is a common component and happens to need to redirect */
<Route component={CommonComponentThatPushesToHistory} />
<div id="body">
/* I usually place this switch in a separate Routes file */
<Switch>
<Route exact path="FooRoute" component={FooPage}/>
<Route exact path="BarRoute" component={BarPage}/>
</Switch>
</div>
/* another common component which does not push to history */
<Footer />
</div>
</BrowserRouter>
);
}
}
export default withRouter(App);
CommonComponentThatPushesToHistory
class CommonComponentThatPushesToHistory extends React.Component{
render(){
return(
<button type="button"
onClick={() => {this.props.history.push('some-page');}}>
Click to get redirected</button>
);
}
}
FooPage 可能有一个推送到历史记录的子组件:
class FooPage extends React.Component{
render(){
return(
<MyChild history={this.props.history} />
);
}
}
然后 MyChild 组件可以像 CommonComponentThatPushesToHistory 一样推送到历史记录。
在完全错误的地方搜索了很多之后,我找出了错误的地方。缺少更新是由 Redux
引起的每当组件被包裹在 connect
中时,它会导致更新被阻止,并且视图不会更新。
这里提到解决方法:
https://github.com/ReactTraining/react-router/issues/4671#issuecomment-285320076
基本上,每个内部有 Route
或 React-Router 东西的组件都必须用 withRouter
编辑:只有使用 connect
的顶级组件才应该包含在 withRouter
中。请注意,这可能会导致性能问题
编辑:我绕过耦合增加的方法是使用一个组件来处理路由。这样,我只需要包装那个组件,并用路由器包装该组件。