reactjs - 无法读取未定义的属性推送

ang*_*iwi 7 javascript reactjs react-router

我有这个代码.我想要做的是当我点击一个按钮'功能'时,它将带我去索引路线.然而,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);
Run Code Online (Sandbox Code Playgroud)

布局组件

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>
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

package.json - 部分

"react": "^0.14.7",
"react-dom": "^0.14.7",
"react-router": "^2.0.1"
 "history": "^2.0.1",
Run Code Online (Sandbox Code Playgroud)

-------------更新到乔丹的回答-------------

Wyl*_*udd 13

在React Router v4中,您不再需要为路由器提供历史记录.相反,你只需使用BrowserRouterHashRouter来自'react-router-dom'.但是,当你不在反应组件中时,这就不清楚如何将溃败推向历史.

解决方案是使用历史记录包.

只需导入createHistory如下:

import createHistory from 'history/createBrowserHistory'
Run Code Online (Sandbox Code Playgroud)

或者我这样做的方式是这样的:

import { createHashHistory } from 'history'
Run Code Online (Sandbox Code Playgroud)

然后创建你的历史

export const history = createHashHistory()
Run Code Online (Sandbox Code Playgroud)

现在你可以推动它:

history.push('/page')
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助那些提出这个问题的人.目前的答案都没有给我我需要的东西.

  • 推送页面时如何刷新页面? (3认同)

小智 10

这可能不是指上面的示例,但我有相同的错误。经过大量调试后,我发现内部组件无法访问历史记录。确保您的历史记录可以访问。

//main.js

<BrowserRouter>
    <div>
        <Route path="/" component={Home}/>
        <Route path="/techMap" component={TechMap}/>
    </div>
 </BrowserRouter>
Run Code Online (Sandbox Code Playgroud)

//app.js

<div>
   <TechStack history= {this.props.history}/>
</div>
Run Code Online (Sandbox Code Playgroud)

//techstack.js

<div>
    <span onClick={this.search.bind(this)}>
    </span>
 </div>
)

search(e){
 this.props.history.push('/some_url');
}
Run Code Online (Sandbox Code Playgroud)

TechStack是我的内部组件。

之前,我能够在app.js中获得历史记录,而在tech.js中则无法。但是在以历史形式传递道具之后,我获得了tech.js的历史和路由作品


Vis*_*ati 6

使用 React router v4,您需要将组件包装在 withRouter 中。然后您可以访问组件中的历史记录。请执行下列操作:

import { withRouter } from 'react-router-dom';
...
...
export default withRouter(MyComponent);
Run Code Online (Sandbox Code Playgroud)


ang*_*iwi 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
}
Run Code Online (Sandbox Code Playgroud)