【发布时间】:2018-01-30 12:42:10
【问题描述】:
有一次我看到了众所周知的警告browser.js:49 Warning: [react-router] You cannot change <Router routes>; it will be ignored,我发现了朋友讨论这个问题的两个趋势问题,解决方案是const路由组件并将它们放入Router组件中。
https://github.com/ReactTraining/react-router/issues/2704
https://github.com/reactjs/react-router-redux/issues/179
如下:
您将看到带有此代码的警告:
class Root extends Component {
render() {
return (
<Router history={browserHistory} createElement={this.createElement}>
<Route component={App}>
<Route path="/" component={MainPage}/>
<Route path="/page2" component={Page2}/>
<Route path="/settings" component={SettingsPage}/>
</Route>
</Router>
)
}
}
但您不会看到此代码的警告:
const routes = (
<Route component={App}>
<Route path="/" component={MainPage}/>
<Route path="/page2" component={Page2}/>
<Route path="/settings" component={SettingsPage}/>
</Route>
);
class Root extends Component {
render() {
return (
<Router history={browserHistory} createElement={this.createElement}>
{routes}
</Router>
)
}
}
这没关系,消除 [react-router] 警告的绝佳解决方案,对于 Root Component 更改 state 时,routes 是静态的,您不会看到任何警告。 但是我的问题是:我将Root Component 道具传递给每个Route,但我无法执行上述解决方案???? ,
我必须将 App Route 放在路由器中,所以使用这种方法绝对不是解决方法,我会再次看到已知警告,请参阅我的路由器代码:
export default class AppRoutes extends Component {
render() {
return (
<Router history={hashHistory}>
<Route path="/" {...this.props} component={App}>
<IndexRoute component={Home} {...this.props}/>
<Route path="/transaction" component={Transaction} {...this.props}/>
<Route path="/users-management" component={UsersManagement} {...this.props}/>
<Route path="/issues" component={Issues} {...this.props}/>
<Route path='/not-found' component={NotFound}/>
<Route path='/settlement-management' component={SettlementManagement} {...this.props}/>
<Route path='/categories-management' component={CategoriesManagement} {...this.props}/>
<Route path='/gifts-management' component={GiftsManagement} {...this.props}/>
<Redirect from='/*' to='/not-found'/>
</Route>
</Router>
);
}
}
Root Component 的渲染代码是:
render(){
return(
<AppRoutes {...this}/>
);
}
我将此作为道具传递给AppRoutes 组件,我需要将继承的this.props 传递给子Routes 并使用它们。我怎么看不到警告并将道具传递给任何Routes?
我的一个解决方案是,我将所有Routes 写为静态并直接在每个组件内部调用Root Componentprops,但是如何?我不知道如何调用并将props 的Root Component 保留在需要props 的Root Component 的组件内,因为该组件不是直接的Root Component 孩子?
【问题讨论】:
标签: javascript reactjs react-router