我正在尝试以编程方式更改页面browserHistory.push。在我的组件之一中,但不在我嵌入其中的组件中。
browserHistory.push
有谁知道为什么我的项目只向子组件而不向父组件抛出错误?
无法读取未定义的属性“ push”
父组件
import React, {Component} from 'react'; import { browserHistory } from 'react-router'; import ChildView from './ChildView'; class ParentView extends Component { constructor(props) { super(props); this.addEvent = this.addEvent.bind(this); } changePage() { this.props.history.push("/someNewPage"); } render() { return ( <div> <div> <button onClick={this.changePage}>Go to a New Page!</button> </div> <ChildView /> // this is the child component where this.props.history.push doesn't work </div> ); } } function mapStateToProps(state) { return { user: state.user }; } function matchDispatchToProps(dispatch) { return bindActionCreators({ setName: setName }, dispatch) } export default connect(mapStateToProps, matchDispatchToProps)(ParentView);
子组件
import React, {Component} from 'react'; import { browserHistory } from 'react-router'; class ChildView extends Component { constructor(props) { super(props); this.addEvent = this.addEvent.bind(this); } changePage() { this.props.history.push("/someNewPage"); } render() { return ( <div> <div> <button onClick={this.changePage}>Go to a New Page!</button> </div> </div> ); } } function mapStateToProps(state) { return { user: state.user }; } function matchDispatchToProps(dispatch) { return bindActionCreators({ setName: setName }, dispatch) } export default connect(mapStateToProps, matchDispatchToProps)(ChildView);
路由器
// Libraries import React from 'react'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; import { browserHistory } from 'react-router'; // Components import NotFound from './components/NotFound'; import ParentView from './components/ParentView'; import ChildView from './components/ChildView'; import SomeNewPage from './components/SomeNewPage'; // Redux import { Provider } from 'react-redux'; import {createStore} from 'redux'; import allReducers from './reducers'; const store = createStore( allReducers, window.devToolsExtension && window.devToolsExtension() ); const routes = ( <Router history={browserHistory}> <div> <Provider store={store}> <Switch> <Route path="/" exact component={Home} /> <Route path="/parentView" component={ParentView} /> <Route path="/someNewPage" component={SomeNewPage} /> <Route path="/childView" component={ChildView} /> <Route component={NotFound} /> </Switch> </Provider> </div> </Router> ); export default routes;
如您所见,这些组件实际上完全相同,只是子组件位于父组件内部。
您在问题中回答了您的问题。
该组件进一步嵌套的事实是您的问题。React Router仅将路由道具注入到它路由到的组件,而不注入到嵌套在其中的组件。
请参阅此问题的公认答案。基本思想是您现在需要找到一种将路由道具注入子组件的方法。您可以通过将孩子包装在HOC中来实现withRouter。
withRouter
export default withRouter(connect(mapStateToProps, matchDispatchToProps)(ChildView));
我希望这有帮助。