React-Router外部链接

Eri*_*sky 67 javascript redirect reactjs react-router react-router-redux

由于我正在使用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"
}
Run Code Online (Sandbox Code Playgroud)

小智 115

这是使用React Router重定向到外部链接的单线程:

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

它使用React纯组件概念将组件的代码减少为单个函数,而不是呈现任何内容,将浏览器重定向到外部URL.

适用于React Router 3和4.

  • `window.location.href` 不是最佳的。如果用户在重定向后单击浏览器的“后退”按钮,她将到达立即再次重定向的路线。为了避免这种情况,最好使用“window.location.replace()”。来源:/sf/answers/35420311/ (7认同)
  • 要获得更好的后退按钮行为(验证您的应用程序),请使用window.location.replace('http://example.com') (5认同)
  • 这可行,但我一直在寻找更优雅的可扩展解决方案。看看我想出了什么,它使我可以进一步进行MobileApps等的重定向(不是ReactNative,真正的本机应用程序)。现在我正在做的不是解决我的问题的正确方法,但是要解决这个问题,我建议您也应该研究我的解决方案,如果没有其他观点。 (2认同)
  • 在我看来,这并不是那么干净。我宁愿诚实地使用锚标签。其次,点击浏览器上的后退按钮会返回路线,然后重定向回 https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies (2认同)

Víc*_*iel 106

使用 react-router 的 Link 组件,您可以做到这一点。在 " to " 道具中,您可以指定 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" />
Run Code Online (Sandbox Code Playgroud)

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

  • 使用路径名将不起作用,至少在最新版本中是这样。无论如何它都会在当前的基本路径之前添加 (55认同)
  • 这对我不起作用。 (10认同)
  • v6.2.1 没有骰子 (7认同)

Eri*_*sky 31

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

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

这是我的组件 - 任何人都很好奇:

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

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

  • @MuhammadUmer或者您只是使用锚标签.react-router非常适合在您的应用程序中进行路由.你可以不同意那个设计决定(我知道*我*做),但它不是"在1999年做得更好",它只是做了同样的事情. (3认同)
  • @Irrech“渲染组件”没有任何意义。如果您对问题有答案,请添加它,并详细说明如何实现。 (2认同)

Die*_*iar 27

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

如果要转到外部链接,请使用锚标记.

<a target="_blank" href="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies">Policies</a>
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,只要能正常工作,并不是每个人都会关心。 (15认同)
  • 如果您确实使用此功能,请将 `rel="noopener noreferrer"` 添加到 `&lt;a&gt;` (11认同)
  • OP正在询问如何以编程方式进行,而不是以声明方式进行 (8认同)
  • 好点子!React-router 旨在处理应用程序内部导航,因此,尽管可以创建自定义元素,但应使用简单的锚标记来创建外部链接。 (5认同)
  • 不确定这些评论,我认为这实际上是一个很好的答案。 (4认同)
  • 不相关且具有误导性的答案。 (3认同)
  • 我最终使用了 mui 的 Link,但多亏了这篇文章,我意识到更简单的方法对我来说是更好的解决方案。 (2认同)

Ala*_*lan 10

它不需要请求反应路由器。此操作可以本地完成,由浏览器提供。

只是使用 window.location

class RedirectPage extends React.Component {
  componentDidMount(){
    window.location.replace('http://www.google.com')
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是目标。它不需要请求反应路由器。此操作可以本地完成,由浏览器提供。 (4认同)
  • 这个答案是不完整的,不允许抽象或它与路由器的关系 (3认同)
  • 我认为这应该被接受的答案。可能该 url 可以作为 prop 公开。 (2认同)

小智 8

我经历过同样的问题。我希望我的作品集重定向到社交媒体句柄。之前我使用的{Link} from "react-router-dom".是重定向到子目录,如下所示,

在此输入图像描述

链接可用于在网站内路由网页。如果我们想重定向到外部链接,那么我们应该使用锚标记。像这样,

在此输入图像描述

  • 请使用文本,而不是文本图片作为代码和任何基于文本的信息(例如 URL)。 (6认同)

Jen*_*dal 7

使用这里的一些信息,我想出了以下组件,您可以在路由声明中使用它。它与 React Router v4 兼容。

它使用打字稿,但转换为原生 javascript 应该相当简单:

interface Props {
  exact?: boolean;
  link: string;
  path: string;
  sensitive?: boolean;
  strict?: boolean;
}

const ExternalRedirect: React.FC<Props> = (props: Props) => {
  const { link, ...routeProps } = props;

  return (
    <Route
      {...routeProps}
      render={() => {
        window.location.replace(props.link);
        return null;
      }}
    />
  );
};
Run Code Online (Sandbox Code Playgroud)

并与:

<ExternalRedirect
  exact={true}
  path={'/privacy-policy'}
  link={'https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies'}
/>
Run Code Online (Sandbox Code Playgroud)


Ren*_*ink 7

最简单的解决方案是使用渲染函数并更改window.location.

<Route path="/goToGoogle"
       render={() => window.location = "https://www.google.com"} />
Run Code Online (Sandbox Code Playgroud)

如果你想要一个小的可重用组件,你可以像这样提取它:

const ExternalRedirect = ({ to, ...routeProps }) => {
   return <Route {...routeProps} render={() => window.location = to} />;
};
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它(例如在路由器交换机中):

<Switch>
    ...
    <ExternalRedirect exact path="/goToGoogle" to="https://www.google.com" />
</Switch>
Run Code Online (Sandbox Code Playgroud)


小智 6

我很幸运:

<Route
    path="/example"
    component={() => {
        global.window && (global.window.location.href = 'https://example.com');
        return null;
    }}
/>
Run Code Online (Sandbox Code Playgroud)


小智 6

我自己(在我的网络应用程序中)通过添加一个锚标记而不使用 React Router 中的任何内容解决了这个问题,只是一个带有链接的普通锚标记,正如您在React 应用程序中使用锚标记的图片屏幕截图中看到的那样使用反应路由器

基本上,您不会将用户路由到应用程序内的另一个页面,因此您不得使用内部路由器,而应使用普通的锚点。

虽然这是针对非 React-Native 的解决方案,但你可以尝试一下。


Oka*_*dag 5

在 React Route V6 中,渲染道具被删除。它应该是一个重定向组件。

重定向网址:

const RedirectUrl = ({ url }) => {
  useEffect(() => {
    window.location.href = url;
  }, [url]);

  return <h5>Redirecting...</h5>;
};
Run Code Online (Sandbox Code Playgroud)

路线:

<Routes>
   <Route path="/redirect" element={<RedirectUrl url="https://google.com" />} />
</Routes>
Run Code Online (Sandbox Code Playgroud)