React-Router Внешняя ссылка

Так как я использую agent-маршрутизатор для обработки своих маршрутов в приложении для реагирования, мне любопытно, есть ли способ перенаправления на внешний ресурс.

Скажите, что кто-то хиты:

example.com/privacy-policy

Я бы хотел, чтобы он перенаправлялся на:

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

Я нахожу ровно нулевую помощь, избегая писать ее в простой JS при загрузке index.html с чем-то вроде:

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

Ответ 1

На самом деле я создал собственный компонент. <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

Ответ 2

Вот одна строка для использования React Router для перенаправления на внешнюю ссылку:

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

Он использует концепцию компонентов React pure, чтобы свести код компонента к одной функции, которая, вместо того чтобы что-либо отображать, перенаправляет браузер на внешний URL-адрес.

Работает как на React Router 3 и 4.

Ответ 3

Нет необходимости использовать компонент <Link /> от реагирующего маршрутизатора.

Если вы хотите перейти на внешнюю ссылку, используйте тег привязки.

<a target="_blank" href="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies">Policies</a>

Ответ 4

Он не требует запроса маршрутизатора. Это действие может выполняться изначально и предоставляется браузером.

просто используйте window.location

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

Ответ 5

Используя некоторую информацию здесь, я придумал следующий компонент, который вы можете использовать в своих объявлениях маршрута. Это совместимо с 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;
      }}
    />
  );
};

И использовать с:

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

Ответ 6

Я не думаю, что React-Router предоставляет эту поддержку. документация упоминает

A <Redirect> устанавливает перенаправление на другой маршрут в приложении для сохранения старых URL-адресов.

Вы можете попробовать использовать что-то вроде React-Redirect вместо

Ответ 7

FOR V3, хотя он может работать для V4. Отправляясь от ответа Relic, мне нужно было сделать немного больше, например, обрабатывать локальную разработку, где "http" нет в URL-адресе. Я также перенаправляюсь на другое приложение на том же сервере.

Добавлено в файл маршрутизатора:

import RedirectOnServer from './components/RedirectOnServer';

       <Route path="/somelocalpath"
          component={RedirectOnServer}
          target="/someexternaltargetstring like cnn.com"
        />

И Компонент:

import React, { Component } from "react";

export class RedirectOnServer extends Component {

  constructor(props) {
    super();
    //if the prefix is http or https, we add nothing
    let prefix = window.location.host.startsWith("http") ? "" : "http://";
    //using host here, as I'm redirecting to another location on the same host
    this.target = prefix + window.location.host + props.route.target;
  }
  componentDidMount() {
    window.location.replace(this.target);
  }
  render(){
    return (
      <div>
        <br />
        <span>Redirecting to {this.target}</span>
      </div>
    );
  }
}

export default RedirectOnServer;

Ответ 8

Чтобы расширить ответ алана, вы можете создать <Route/>, который перенаправляет все <Link/> с атрибутами "to", содержащими "http:" или "https:", на правильный внешний ресурс.

Ниже приведен рабочий пример этого, который можно поместить прямо в ваш <Router>.

<Route path={['/http:', '/https:']} component={props => {
  window.location.replace(props.location.pathname.substr(1)) // substr(1) removes the preceding '/'
  return null
}}/>

Ответ 9

Используя React with Typcript, вы получаете ошибку, так как функция должна возвращать элемент реакции, а не void. Поэтому я сделал это так, используя метод рендеринга Route (и используя React router v4):

redirectToHomePage = (): null => {
    window.location.reload();
    return null;
  };    
<Route exact path={'/'} render={this.redirectToHomePage} />

Вместо этого вы можете использовать window.location.assign(), window.location.replace() т.д.

Ответ 10

Если вы используете разборку на стороне сервера, вы можете использовать StaticRouter. С помощью context в качестве props, а затем добавьте компонент <Redirect path="/somewhere" /> в ваше приложение. Идея заключается в том, что каждый раз, когда response-router сопоставляет компонент перенаправления, он добавляет что-то в контекст, который вы передавали в статический маршрутизатор, чтобы сообщить, что ваш путь соответствует компоненту перенаправления. теперь, когда вы знаете, что попали в перенаправление, вам просто нужно проверить, есть ли это перенаправление, которое вы ищете. затем просто перенаправлять через сервер. ctx.redirect('https://example/com').

Ответ 11

Мне удалось добиться перенаправления в реакции-маршрутизатор-дом, используя следующие

<Route exact path="/" component={() => <Redirect to={{ pathname: '/YourRoute' }} />} />

В моем случае я искал способ перенаправить пользователей всякий раз, когда они посещают корневой URL-адрес http://myapp.com где-то еще в приложении http://myapp.com/newplace. так вышесказанное помогло.