当前位置: 首页 > 面试题库 >

使用React Router重定向页面的最佳方法是什么?

施俊远
2023-03-14
问题内容

我是React Router的新手,并了解到重定向页面的方法有很多:

  1. 使用 browserHistory.push("/path")
        import { browserHistory } from 'react-router';
    //do something...
    browserHistory.push("/path");
  1. 使用 this.context.router.push("/path")
        class Foo extends React.Component {
        constructor(props, context) {
            super(props, context);
            //do something...
        }
        redirect() {
            this.context.router.push("/path")
        }
    }

    Foo.contextTypes = {
        router: React.PropTypes.object
    }
  1. 在React Router v4中,有this.context.history.push("/path")this.props.history.push("/path")

我对所有这些选项感到困惑,是否有最佳的方法来重定向页面?


问题答案:

实际上,这取决于您的用例。

1)您想保护您的路线免受未经授权的用户的侵害

如果是这种情况,则可以使用称为的组件,<Redirect />并可以实现以下逻辑

    import React from 'react'
    import  { Redirect } from 'react-router-dom'

    const ProtectedComponent = () => {
      if (authFails)
        return <Redirect to='/login'  />
      }
      return <div> My Protected Component </div>
    }

请记住,如果您想<Redirect />按预期的方式工作,则应将其放在组件的render方法中,以便最终应将其视为DOM元素,否则它将无法工作。

2)您要在执行某项操作后进行重定向(例如,创建项目后)

在这种情况下,您可以使用历史记录:

    myFunction() {
      addSomeStuff(data).then(() => {
          this.props.history.push('/path')
        }).catch((error) => {
          console.log(error)
        })

要么

    myFunction() {
      addSomeStuff()
      this.props.history.push('/path')
    }

为了访问历史记录,您可以使用名为的HOC包装组件withRouter。当您用它包装您的组件时,它会通过match
location并进行history支撑。有关更多详细信息,请参阅withRouter的官方文档。

如果你的组件是一个的子<Route />组件,即如果是这样<Route path='/path' component={myComponent} />,你不必换用您的组件withRouter,因为<Route />传球matchlocationhistory它的孩子。

3)单击某些元素后重定向

这里有两个选择。您可以history.push()通过将其传递给onClick事件来使用:

<div onClick={this.props.history.push('/path')}> some stuff </div>

或者您可以使用一个<Link />组件:

 <Link to='/path' > some stuff </Link>

我认为这种情况的经验法则是首先尝试使用<Link />,我想尤其是因为性能。



 类似资料:
  • 我是React Router的新手,我了解到有很多方法可以重定向页面: 在React Router v4中,有和。详细说明:如何在React路由器V4中推到历史? 我被所有这些选项弄糊涂了,有没有一个最好的方法来重定向一个页面?

  • 问题内容: 任何人都可以建议我使用以下两种方法中使用REST重定向URL的最佳方法: 问题答案: 重定向有多种形式。该HTTP状态代码系列包含: 这些和其他代码具有不同的语义。正确的选择取决于您的情况。资源是否已永久移动到新位置?还是重定向只是临时的?

  • 问题内容: 从Symfony2.3安全文档: 如果访问被拒绝, 则系统将尝试对用户进行身份验证(如果尚未进行身份验证)(例如,将用户重定向到登录页面) 。如果用户已经登录,将显示403“访问被拒绝”错误页面。有关更多信息,请参见如何自定义错误页面。 我目前在一条路线上使用一条规则。如果匿名用户被重定向到登录路由,我想通过一条消息“ 您必须登录才能访问该页面 ” 来通知他们。我已经阅读了几次安全性文

  • 问题内容: 背景 我有很多字段,这些字段将通过外部进程实时更新。我想定期更新Flask托管页面,以向连接的用户显示任何更改。理想情况下,整个页面不会刷新,这是对类似系统的抱怨,而只是更新页面上的许多字段。 当前方向 我目前的想法是使用可能的JavaScript来处理此问题,但是我不确定使用Flask时是否甚至可以实现。 Flask或第3方模块是否可以实现此目的? 其他信息 数据将使用各种套接字和串

  • 问题内容: 我有mongodb和NodeJs。通过mongoosejs完成连接。 开发Ajax Infinity滚动的最佳方法是什么?我应该使用极限和偏移量吗? 问题答案: 当您对数据集进行分页时,“跳过并限制”方法不是很有效。它实际上是Shlemiel Painter的算法 。 范围查询效率更高(当索引支持时)。例如,假设您正在显示推文。您的页面大小是20,您在第1000页上,并且想要加载第10

  • 问题内容: 最好的说,我是最高效的,现在我唯一想到的就是将其放在我的post.php文件中: 有没有更好的方法,那就是消耗更少服务器资源的方法。我问,因为如果这是一个小型应用程序,那么我在上面没有问题,但是我正在尝试构建一些将被许多人使用的东西,并且我希望尽可能地了解查询。 问题答案: 如果您有兴趣节省资源并仍然使用SQL进行报告,而精确的#值无关紧要,则可以尝试这样采样(修改采样率以适合您的规模