【问题标题】:Auto redirect with React?使用 React 自动重定向?
【发布时间】:2018-06-25 23:13:23
【问题描述】:

鉴于以下组件代码,有没有办法在给定的毫秒数后自动重定向到另一个路由?

import React, { Component } from "react";
import {
  Route,
  NavLink,
  HashRouter
} from "react-router-dom";
import {
  Container,
  Button,
  Col,
  Row } from 'reactstrap'

class Confirm extends Component {
  render() {
    return (
      <div>
        <Container>
          <Row>
            <p>Reprehenderit reprehenderit laborum excepteur voluptate elit incididunt eu. Ex laboris ex officia do aute non. Dolor proident reprehenderit labore nostrud irure consectetur. Laboris laborum amet veniam tempor nostrud ad. Laborum culpa duis voluptate amet ipsum magna minim reprehenderit. Aute ipsum eiusmod amet occaecat culpa qui nostrud eiusmod dolore anim culpa amet nostrud. Id laborum tempor dolor labore veniam aliqua ipsum esse pariatur. Nisi ipsum eiusmod do eiusmod minim adipisicing aliqua. Nostrud tempor aliquip cupidatat sunt aute esse duis cupidatat culpa elit consectetur eu.</p>
          </Row>
        </Container>
      </div>
    );
  }
}

export default Confirm;

查看文档,react-router-dom 中似乎有一些功能,不是吗?

非常感谢。

编辑:在研究了根据答案操纵一些事情之后,我做了一些改变并想出了这个:

import React, { Component } from "react";
import {
  Route,
  NavLink,
  HashRouter,
  BrowserRouter
} from "react-router-dom";
import {
  Container,
  Button,
  Col,
  Row } from 'reactstrap'
  import './Confirm.css';

class Confirm extends Component {
  componentDidMount() {
    setTimeout(() => {
    BrowserRouter.push("./home")
  }, 2000)
    }
    render() {
      return (
        <div>
          <Container>
            <Row>
              <p>Reprehenderit reprehenderit laborum excepteur voluptate elit incididunt eu. Ex laboris ex officia do aute non. Dolor proident reprehenderit labore nostrud irure consectetur. Laboris laborum amet veniam tempor nostrud ad. Laborum culpa duis voluptate amet ipsum magna minim reprehenderit. Aute ipsum eiusmod amet occaecat culpa qui nostrud eiusmod dolore anim culpa amet nostrud. Id laborum tempor dolor labore veniam aliqua ipsum esse pariatur. Nisi ipsum eiusmod do eiusmod minim adipisicing aliqua. Nostrud tempor aliquip cupidatat sunt aute esse duis cupidatat culpa elit consectetur eu.</p>
            </Row>
          </Container>
        </div>
      );
    }
  }

export default Confirm;

但是由于某种原因推送不起作用。这是因为hashrouterbrowserrouter 之间的冲突吗?

我得到的是这样的:

【问题讨论】:

  • 给定毫秒数,你在哪里运行计时器?可能的重定向方式是使用Redirect 组件或使用this.props.history.push(.....)
  • 在 setTimeout 中执行一个函数,该函数以编程方式路由到所需的 url,检查如何以编程方式导航,stackoverflow.com/questions/44127739/…

标签: javascript reactjs redirect react-router react-router-dom


【解决方案1】:
class Confirm extends Component {
 componentDidMount() {
  setTimeout(() => {
  browserhistory.push("path/to/your/next/route")
}, 2000)
  }
  render() {
    return (
      <div>
        <Container>
          <Row>
            <p>Reprehenderit reprehenderit laborum excepteur voluptate elit incididunt eu. Ex laboris ex officia do aute non. Dolor proident reprehenderit labore nostrud irure consectetur. Laboris laborum amet veniam tempor nostrud ad. Laborum culpa duis voluptate amet ipsum magna minim reprehenderit. Aute ipsum eiusmod amet occaecat culpa qui nostrud eiusmod dolore anim culpa amet nostrud. Id laborum tempor dolor labore veniam aliqua ipsum esse pariatur. Nisi ipsum eiusmod do eiusmod minim adipisicing aliqua. Nostrud tempor aliquip cupidatat sunt aute esse duis cupidatat culpa elit consectetur eu.</p>
          </Row>
        </Container>
      </div>
    );
  }
}

这应该可以完成这项工作,使用 componentDidMount 因为它只会在生命周期中发生一次,并且组件也会被挂载

【讨论】:

  • 感谢您的信息。在我的问题中添加了一些附加信息,并从中尝试了一些事情。不过还是有一些问题......
  • Browserrouter.push 不存在。您可以从“react-router”导入 { browserHistory },然后执行 browserHistory.push("your/route")。
  • 只是一个友好的提醒,browserHistory 不适用于 react-router v4
  • 哦,我不知道,如果您使用的是 react route v4,请在 react-router 4 中查找相应的选项
【解决方案2】:

您可以在组件内任何可以访问它的地方使用 history 属性。 在 componentDidMount() 你可以这样做:

this.handle = setTimeout(()=>{this.props.history.push(myUrl);}, milisecs);

并且在 componentDidUnmount() 中取消它,因为在时间段结束之前你可能会去其他地方,然后它仍然会无缘无故地重定向你:

clearTimeout(this.handle);

我假设您的 Confirm 组件直接用作某些 Route 的“组件”道具。
就这样

<Route path='/myUrl' component={Confirm} />

这就是您访问历史道具的方式。如果没有,您将需要像这样包装 Confirm:

import {withRouter} from 'react-router';
// define Confirm
export default withRouter(Confirm);

这将使您的包装组件能够访问特殊的路由道具。

【讨论】:

  • 感谢您的信息。在我的问题中添加了一些附加信息,并从中尝试了一些事情。不过还是有一些问题......
  • 我认为您不需要从文件中的“react-router-dom”导入任何内容,因为我没有看到您使用它的任何地方(在该文件中)。另外,我对您为什么要执行“BrowserRouter.push”感到有些困惑。它应该是“this.props.history.push”。下面的海报提到了“browserhistory.push”,它在 react-router v3 中有效,但要小心,因为它在 v4 中发生了变化
  • 我没有关注组件是否已安装。那些在同一个组件中吗?因为如果组件确实挂载了,它就已经被渲染了。那么我只使用HashrouterBrowserrouter?
  • 这里有一个链接可能会有所帮助:youtube.com/watch?v=1iAG6h9ff5s如果您在观看后有任何问题,我很乐意为您解答:)
猜你喜欢
  • 2015-06-18
  • 2022-10-06
  • 2022-06-11
  • 2020-08-10
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多