2015-06-28 5 views
3

Я использую маршрутизатор реакции для маршрутизации на стороне клиента. У меня есть кнопка, и когда кто-то нажимает кнопку, я хочу перенаправить пользователя на другой URL-адрес. Например, я хочу перенаправить пользователя на «http://www.google.com». Я использовал навигационный микс и использовал this.transitionTo («https://www.google.com»). Но когда я делаю это, я получаю эту ошибку. Инвариантное нарушение: не удается найти маршрут с именем «https://www.google.com».перенаправление перенаправления на другой домен.

Я могу использовать window.location, но это правильный путь?

ответ

7

Вам не нужно react-router для внешних ссылок, можно использовать обычные элементы ссылок (как JSX <a href="..."/>)

Вам нужно только react-router, когда у вас есть внутреннего навигации (т.е. от одного компонента к другому), для которого URL-адрес браузера должен выглядеть так, как будто ваше приложение фактически переключает «реальные» URL-адреса.

+4

Как это ответить? Возникает вопрос: «Как перенаправить мое приложение на кнопку, нажав на внешний URL?». Вопрос обобщается на «как перенаправить программно в ответ на событие?» Вы не можете использовать элемент ссылки для этого ... – GreenAsJade

+0

A '

+0

Извините, но я до сих пор не правильно передал вызов. Речь идет не о том, чтобы сделать переадресацию видимого элемента с интерактивным доступом. Речь идет о перенаправлении после обработки события в коде обработчика события. Это может быть кнопка onClick или другое событие, которое активирует код. Изнутри кода вам необходимо перенаправить пользователя на внешний URL, основанный на некоторой программной логике. Вопрос заключается в том, чтобы спросить: «Это window.location правильный способ сделать это?» – GreenAsJade

1

Почему бы не использовать location property of window объект? Он даже обеспечивает хороший функциональный метод для перехода во внешнее местоположение. См. ref.

Так что, если у вас есть компонент, скажем

class Button extends Component { 
    render() { 
    return (
     <button onClick={::this.handleClick} /> 
    ); 
    } 
} 

тогда handleClick не будет выглядеть

handleClick() { 
    // do something meaningful, Promises, if/else, whatever, and then 
    window.location.assign('http://github.com'); 
} 

Нет необходимости импортировать window, так как это глобальная. Должен отлично работать в любом современном браузере.

+1

Кстати, убедитесь, что это действительно необходимо. Это может вызвать большую боль у других программистов, когда они начинают работать с вами в один прекрасный день или берут вашу кодовую базу после того, как вы уже давно покинули проект. –

0

Я не мог найти простой способ сделать это с помощью React Router. Как писал @Mike, вы должны использовать привязку (<a>) при отправке пользователя на внешний сайт.

Я создал пользовательский компонент <Link> динамически решить, следует ли вынести маршрутизатор React-<Link> или регулярный <a> тег.

import * as React from "react"; 
import {Link, LinkProps} from "react-router-dom"; 

const ReloadableLink = (props: LinkProps & { forceReload?: boolean }) => { 
    const {forceReload, ...linkProps} = props; 
    if (forceReload) 
     return <a {...linkProps} href={String(props.to)}/>; 
    else 
     return <Link {...linkProps}> 
      {props.children} 
     </Link> 
}; 

export default ReloadableLink; 
Смежные вопросы