我有这个代码。我想要做的是当我点击一个按钮'功能'它会带我去索引路线。然而,React一直在说“无法读取未定义的属性推送”。我做错了什么?
route.js
import React from "react";
import ReactDOM from "react-dom";
import {Router, Route, hashHistory, IndexRoute } from "react-router";
import Layout from "./page/Layout";
import Features from "./page/Features";
import Features from "./page/archive";
const app = document.getElementById('app');
ReactDOM.render(
<Router history={hashHistory}>
<Route path="/" component={Layout}>
<IndexRoute component={Features} />
<Route path="archive" component={Archive} />
</Route>
</Router>, app);
布局组件
import React from "react";
import {Link, Router, Route, hashHistory} from "react-router";
export default class Layout extends React.Component{
navigate(){
this.context.router.push('/');
}
render(){
return(
<div>
{this.props.children}
<button onClick={this.navigate.bind(this)}>feature</button>
</div>
)
}
}
package.json - partial
"react": "^0.14.7",
"react-dom": "^0.14.7",
"react-router": "^2.0.1"
"history": "^2.0.1",
-------------更新到约旦的答案-------------
答案 0 :(得分:12)
在React Router v4中,您不再需要为路由器提供历史记录。相反,您只需使用来自&#39; react-router-dom&#39;的BrowserRouter
或HashRouter
。但是,当你不在反应组件中时,这就不清楚如何将溃败推向历史。
解决方案是使用history包。
只需像这样导入createHistory
:
import createHistory from 'history/createBrowserHistory'
或者我这样做是这样的:
import { createHashHistory } from 'history'
然后创建您的历史
export const history = createHashHistory()
现在你可以推进它:
history.push('/page')
我希望这可以帮助那些提出这个问题的人。目前的答案都没有给我我需要的东西。
答案 1 :(得分:5)
这可能不是指上面的例子,但我有同样的错误。经过大量的调试后,我发现我的内部组件无法访问历史记录。确保您的历史记录可以访问。
// main.js
<BrowserRouter>
<div>
<Route path="/" component={Home}/>
<Route path="/techMap" component={TechMap}/>
</div>
</BrowserRouter>
// app.js
<div>
<TechStack history= {this.props.history}/>
</div>
// techstack.js
<div>
<span onClick={this.search.bind(this)}>
</span>
</div>
)
search(e){
this.props.history.push('/some_url');
}
TechStack是我的内在组成部分。
之前我能够在app.js中获取历史记录但不能在tech.js中获取历史记录。 但是在以历史形式传递道具之后,我获得了tech.js和路由工作的历史
答案 2 :(得分:4)
您需要将route.js页面更改为
import {Router, browserHistory} from 'react-router';
ReactDOM.render(
<Router history={browserHistory}>
<Route path="/" component={Layout}>
<IndexRoute component={Features} />
<Route path="archive" component={Archive} />
</Route>
</Router>, app);
然后,您想要浏览的任何地方都可以使用
import {Router, browserHistory} from 'react-router';
browserHistory.push('/');
react-router docs鼓励您使用browserHistory而不是hashHistory
hashHistory使用URL哈希以及查询键来跟踪 州。 hashHistory不需要额外的服务器配置,但是 通常不如browserHistory优先。
答案 3 :(得分:1)
我使用browserHistory而不是HashHistory。 然后我只需要做以下事情:
import { browserHistory } from 'react-router'
// ...
// ...
navigate(){
browserHistory.push('/');
}
答案 4 :(得分:1)
您不再需要使用browserHistory了。 React-router-dom注入组件路由相关的道具和上下文。 其中一个道具是'历史',在这个历史对象上是一个功能推送,你可以调用并传递你想要导航到的路线。
在类基本组件中的示例,您可以创建一个类似下面的函数作为onClick处理程序来重定向到特定链接
redirectToPage() {
this.props.history.push('/page'); OR
this.context.router.history.push('/page');
}
在函数库无状态组件中
redirectToSessionStatePage() {
props.history.push('/page');OR
context.router.history.push('/page');
}
答案 5 :(得分:1)
通常,当您尝试从嵌套组件重定向时,会出现此错误。
有几种方法可以解决
使用react-dom,您可以从react-router-dom导入withRouter组件,然后与this.props.history.push照常使用它,而不是通常的导出默认“类”,我们将使用export default与Router(class );和繁荣问题解决。
答案 6 :(得分:0)
Change your Layout component to have navigate assigned to ES6 lambda. This is needed to set the correct value of this
import React from "react";
import {Link, Router, Route, hashHistory} from "react-router";
export default class Layout extends React.Component{
navigate = () => {
this.context.router.push('/');
}
render(){
return(
<div>
{this.props.children}
<button onClick={this.navigate.bind(this)}>feature</button>
</div>
)
}
}
答案 7 :(得分:0)
export default class Layout extends React.Component{
navigate = () => {
this.context.router.push('/');
}
render(){
return(
<div>
{this.props.children}
<button onClick={this.navigate.bind(this)}>feature</button>
</div>
)
}
}
Layout.contextTypes = {
router: PropTypes.object.isRequired
}
答案 8 :(得分:0)
您似乎用/ archives目录中的任何内容覆盖了您的功能导入。在您发布的代码中,您有:
import Features from "./page/Features";
import Features from "./page/archive";
答案 9 :(得分:0)
使用React router v4,您需要将组件包装在withRouter中。然后,您可以访问组件中的历史记录。请执行以下操作:
import { withRouter } from 'react-router-dom';
...
...
export default withRouter(MyComponent);
答案 10 :(得分:0)
从“ react-router-dom”导入{withRouter};
使用Router(AppName)导出默认值;