【问题标题】:How to use React's Router v4 history.push() [duplicate]如何使用 React 的 Router v4 history.push() [重复]
【发布时间】:2018-01-21 19:21:17
【问题描述】:

注意:我对 React 和 Meteor 还很陌生,所以在回答我的问题时请非常具体。

我正在尝试使用流星和反应制作短信应用程序,但是,我正在使用的教程使用 React v3,我想知道如何在 v4 中做同样的事情,即使用 browserHistory.push() 或browserHistory.replace() 将用户发送到另一个页面。到目前为止,我正在做一个页面,他们可以在其中将他们的名字设置为他们想要的任何名字,然后将他们链接到聊天页面。我知道网上有很多关于此的文章和文档,但它们都是非常复杂的示例。如果可以的话,你能告诉我将某人重定向到另一个页面的最基本方法吗?

SetName.js:

import React from "react";
import { BrowserRouter } from 'react-router-dom'

export default class SetName extends React.Component{
    validateName(e){
        e.preventDefault();
        let name = this.refs.name.value;
        if(name){
            console.log(name);
        }
        this.props.history.push('/asd')
    }
    render(){
        return(
            <div>
                <form onSubmit={this.validateName.bind(this)}>
                    <h1>Enter a  Name</h1>
                    <input ref="name" type="text"/>
                    <button>Go to Chat</button>
                </form>
            </div>
        )
    }
}

ma​​in.js

import React from "react";
import ReactDOM from "react-dom";
import {Meteor} from "meteor/meteor";
import {Tracker} from "meteor/tracker";
import { BrowserRouter, Route, Switch } from 'react-router-dom'

import {Texts} from "./../imports/api/Text";
import App from "./../imports/ui/App";
import Name from "./../imports/ui/Name";
import NotFound from "./../imports/ui/NotFound";
import SetName from "./../imports/ui/SetName";

Meteor.startup(() => {
    Tracker.autorun(() => {
        let texts = Texts.find().fetch();
        const routes = (
            <BrowserRouter>
                <Switch>
                    <App path="/chat" texts={texts}/>
                    <SetName path="/setName" />
                    <Route component={NotFound}/>
                </Switch>
            </BrowserRouter>
        );
        ReactDOM.render(routes, document.getElementById("app"));
    });
});

【问题讨论】:

    标签: reactjs meteor react-router react-router-v4


    【解决方案1】:

    如果您已经在使用 react router 4,那么您可以简单地执行以下操作来获取组件中的路由器历史记录。确保您在路由器内部渲染组件,否则您必须以不同的方式进行。您可以通过打印 this.props 来检查这一点 在您的组件中。如果它有历史记录,则执行以下操作,否则执行下面的下一个逻辑。

    this.props.history.push('your routing location').
    

    如果您的组件不在路由器内部,请执行以下操作

    import { withRouter } from 'react-router';
    
    ... your react component 
    
    export default withRouter(yourcomponent);
    

    通过这种方式,它会将路由器历史记录作为道具注入到您的组件中。

    【讨论】:

    • 当我这样做时,我得到一个错误,“Uncaught TypeError: Cannot read property 'push' of undefined” 我在上面添加了我的 main.js 文件,所以你可以检查一下。
    • 将您的 validateName(e) {} 更改为 validateName = (e) => {} 以便它可以访问类级别 this 关键字,否则它只会在函数内部处理 this。
    猜你喜欢
    • 2018-06-08
    • 2018-07-08
    • 1970-01-01
    • 2021-02-01
    • 2017-09-02
    • 2018-07-15
    • 2018-02-20
    相关资源
    最近更新 更多