React-Router 外部链接

IT技术 javascript reactjs redirect react-router react-router-redux
2021-02-08 05:16:44

由于我在 React 应用程序中使用 react-router 来处理我的路由,我很好奇是否有办法重定向到外部资源。

说有人打:

example.com/privacy-policy

我希望它重定向到:

example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

我发现在我的 index.html 加载中避免在纯 JS 中编写它的帮助为零,例如:

if ( window.location.path === "privacy-policy" ){
  window.location = "example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies"
}
6个回答

这是使用 React Router 重定向到外部链接的单行代码:

<Route path='/privacy-policy' component={() => { 
     window.location.href = 'https://example.com/1234'; 
     return null;
}}/>

它使用 React 纯组件概念将组件的代码简化为单个函数,而不是渲染任何内容,而是将浏览器重定向到外部 URL。

适用于 React Router 3 和 4。

这有效,但我正在寻找更优雅的可扩展解决方案。看看我想出了什么,因为它让我可以在移动应用程序等(不是 ReactNative,真正的原生应用程序)的重定向方面走得更远。现在我正在做的不是解决我的问题的正确方法,但是为了解决这个问题,我建议你也调查我的解决方案,如果只是为了不同的观点。
2021-03-20 05:16:44
没有一个答案,原始帖子仅询问客户端重定向,同时意识到没有 301 或 302 类型的真正重定向支持。
2021-04-01 05:16:44
为了更好的后退按钮行为(验证您的应用程序),请使用 window.location.replace(' example.com' )
2021-04-05 05:16:44
这在我看来并不是那么干净。老实说,我宁愿使用锚标签。其次,点击浏览器上的后退按钮会返回路由,然后重定向回example.zendesk.com/hc/en-us/articles/...
2021-04-08 05:16:44
window.location.href不是最优的。如果用户在被重定向后单击浏览器的“返回”按钮,她将到达将立即再次重定向她的路由。为了避免这种情况,最好使用window.location.replace(). 来源:stackoverflow.com/a/506004/163411
2021-04-08 05:16:44

使用 react-router 的 Link 组件,您可以做到这一点。在 " to " props中,您可以指定 3 种类型的数据:

  • a string:链接位置的字符串表示形式,通过连接位置的路径名、搜索和哈希属性创建。
  • 对象:可以具有以下任何属性的对象:
    • pathname : 表示要链接到的路径的字符串。
    • search:查询参数的字符串表示形式。
    • hash : 放在 URL 中的哈希,例如 #a-hash。
    • state:坚持到该位置的状态。
  • 一个函数:一个函数,当前位置作为参数传递给它,它应该以字符串或对象的形式返回位置表示

对于您的示例(外部链接):

https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

您可以执行以下操作:

<Link to={{ pathname: "https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies" }} target="_blank" />

您还可以传递您想要的props,例如标题、id、className 等。

@Lorenzo 我已经使用过它并且它正在工作!
2021-03-13 05:16:44
这对我不起作用。
2021-03-31 05:16:44
使用路径名不起作用,至少在最新版本中是这样。无论如何它都会在当前基本路径之前
2021-04-07 05:16:44
在 React-router 5 中对我不起作用
2021-04-08 05:16:44

无需使用<Link />react-router 中的组件。

如果您想转到外部链接,请使用锚标记。

<a target="_blank" href="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies">Policies</a>
不相关且误导性的答案。
2021-03-12 05:16:44
如果您确实使用它,请添加rel="noopener noreferrer"<a>
2021-03-15 05:16:44
好点子!react-router 旨在处理应用程序内部导航,因此,尽管可以创建自定义元素,但应使用简单的锚标记创建外部链接。
2021-03-17 05:16:44
很好的答案,并不是每个人都会在意,只要他们能成功。
2021-03-23 05:16:44
OP 询问如何以编程方式而不是声明方式进行操作
2021-04-02 05:16:44

它不需要请求react-router。此操作可以在本地完成,并且由浏览器提供。

只是使用 window.location

class RedirectPage extends React.Component {
  componentDidMount(){
    window.location.replace('https://www.google.com')
  }
}

另外,如果您想在新选项卡中打开它:

window.open('https://www.google.com', '_blank');
这就是目标。它不需要请求反应路由器。此操作可以在本地完成,并且由浏览器提供。
2021-03-12 05:16:44
我认为这应该是可以接受的答案。可能 url 可以作为道具公开。
2021-03-19 05:16:44
如果我们想在重定向到外部站点的同时动态地传递 URL 和 HTTP 状态代码,该怎么办。我有一些例子,但不清楚我的要求。gist.github.com/arasmussen/f2c01dc858481590f6bffae6b540632c
2021-04-03 05:16:44
这个答案是不完整的,不允许抽象或者它与路由器的关系
2021-04-07 05:16:44

我实际上最终构建了自己的组件。<Redirect> 它从react-router元素中获取信息,因此我可以将其保留在我的路线中。如:

<Route
  path="/privacy-policy"
  component={ Redirect }
  loc="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies"
  />

这是我的组件,以防万一有人好奇:

import React, { Component } from "react";

export class Redirect extends Component {
  constructor( props ){
    super();
    this.state = { ...props };
  }
  componentWillMount(){
    window.location = this.state.route.loc;
  }
  render(){
    return (<section>Redirecting...</section>);
  }
}

export default Redirect;

编辑 - 注意:这是与react-router: 3.0.5,它在 4.x 中并不那么简单

在 react -router v4 中,您可以使用渲染代替组件
2021-03-21 05:16:44
@MuhammadUmer 或者您只使用锚标记。react-router 非常严格地用于在您的应用程序中进行路由。你可以不同意那个设计决定(我知道同意),但它并不是“在 1999 年做得更好”,它只是做了同样的事情。
2021-03-21 05:16:44
@Irrech“渲染代替组件”没有任何意义。如果您有问题的答案,请添加它并详细说明您将如何实施。
2021-03-29 05:16:44
你不必做任何事情,react 是一个框架,框架中有很多value。这是如何在反应框架内做到这一点。然而,它没有考虑可以在这里包装的浏览器历史记录module,这使得它更加有用。另请注意“window.location”是在 1999 年完成的。这只是将它添加到客户端路由的路由表的一种方法。这不是一个“好”的解决方案。
2021-04-03 05:16:44
如果我们想在重定向到外部站点的同时动态地传递 URL 和 HTTP 状态代码,该怎么办。我有一些例子,但不清楚我的要求 gist.github.com/arasmussen/f2c01dc858481590f6bffae6b540632c
2021-04-06 05:16:44