React-Router Harici bağlantısı


117

Bir react uygulamasında rotalarımı işlemek için react-router kullandığım için, harici bir kaynağa yönlendirmenin bir yolu olup olmadığını merak ediyorum.

Birinin isabet ettiğini söyle:

example.com/privacy-policy

Yeniden yönlendirilmesini istiyorum:

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

İndex.html'de düz JS'de yazmaktan kaçınmak için tam olarak sıfır yardım buluyorum:

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

Hangi React Router'ı kullanıyorsunuz?
Tyler McGinnis

3.x sürümünü kullanıyorum
Eric Hodonsky

1
window.location.hrefResmi bir yeniden yönlendirmeye sahip olmak için basitçe değiştirin .
Amirhossein Mehrvarzi

2
@AmirhosseinMehrvarzi bu aslında hiçbir şey ifade etmiyor. Daha spesifik olabilir misiniz veya bir örnek verebilir misiniz? Ayrıca fark ettiniz mi emin değilim, ancak bu sorunun zaten React & React Router ile ilgili kabul edilmiş bir cevabı var ki bu soru da buydu.
Eric Hodonsky

1
@Relic Bunu if koşulunuzda url'niz olarak kullanmanız gerekir. Birkaç gün önce benzer bir sorun yaşadım ve bu yolu basit ve etkili buldum. Hemen yönlendirir. Kabul edilen yanıt , benimki gibi herhangi bir ortamda çalışmayan bir Yönlendirme çözümüdür (Rota ilkelerini ihlal etse de , Rota mimarisinin Uygulama içinde dışarıya yönelik olmadığı düşünülürse )
Amirhossein Mehrvarzi

Yanıtlar:


173

Harici bir bağlantıya yönlendirmek için React Router'ı kullanmak için tek satırlık bir kılavuz:

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

Bileşen kodunu, herhangi bir şeyi oluşturmak yerine tarayıcıyı harici bir URL'ye yönlendiren tek bir işleve indirgemek için React pure bileşen konseptini kullanır.

Hem React Router 3 hem de 4 üzerinde çalışır.


2
Bu işe yarıyor, ancak daha zarif, ölçeklenebilir bir çözüm arıyordum. Mobil Uygulamalar vb. İçin yönlendirmelerle daha da ileri gitmeme izin verdiği için ne bulduğumu görün (ReactNative Değil, gerçekten Yerel uygulamalar). Şimdi yaptığım şey sorunumu çözmenin doğru yolu değil, ancak bu sorunu çözmek için, farklı bir bakış açısından başka bir şey olmasa da çözümümü de araştırmanızı öneririm.
Eric Hodonsky

1
Bu aklımda pek de temiz değil. Dürüstçe bir çapa etiketi kullanmayı tercih ederim. İkincisi, daha sonra geri yönlendirir o rota tarayıcı getiri size geri düğmesine basarak example.zendesk.com/hc/en-us/articles/...
Jonathan Rys

11
Daha iyi geri düğmesi davranışı için (uygulamanızı doğrulayın), window.location.replace (' example.com' ) kullanın
MattC

1
Yanıtların hiçbiri uymuyor, orijinal gönderi yalnızca istemci yönlendirmeleri hakkında soru soruyordu, WHILE, 301 veya 302 türü gerçek yönlendirme desteği olmadığının farkındaydı.
Eric Hodonsky

51

<Link />React-router'dan bileşen kullanmaya gerek yoktur .

Harici bağlantıya gitmek istiyorsanız bir bağlantı etiketi kullanın.

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

23
OP bunu açıklayıcı olarak değil, programlı olarak nasıl yapılacağını soruyordu
Eric Hodonsky

14
İlgisiz ve yanıltıcı cevap.
Priya Ranjan Singh

1
Bunu kullanıyorsanız, eklemek rel="noopener noreferrer"için<a>
S ..

6
Güzel cevap, işe yaradığı sürece herkes umursamayacak.
FrankByte.com

40

Aslında kendi Bileşenimi oluşturmaya başladım. <Redirect> Öğeden bilgi alır, react-routerböylece onu rotamda tutabilirim. Gibi:

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

İşte benim bileşen durumum - herkes merak ediyor:

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;

DÜZENLEME - NOT: Bu, react-router: 3.0.54.x'te o kadar basit değil


hiçbir şey yapmanız ZORUNLU değilsiniz, tepki bir çerçevedir ve bir çerçevede çok fazla değer vardır. React çerçevesinde bunun nasıl yapılacağı BU. Ancak, buraya sarılabilecek tarayıcı geçmişi modülünü hesaba katmaz, bu da bunu daha da kullanışlı hale getirir. Ayrıca lütfen "window.location" un 1999'da nasıl yapıldığını unutmayın. Bu, onu istemci tarafı yönlendirme için yol tablonuza eklemenin bir yoludur. Bu "iyi" bir çözüm değil.
Eric Hodonsky

react -router v4'te render bileşenini kullanabilirsiniz
Irrech

3
@Irrech "bileşen yerine render" hiçbir şey ifade etmiyor. Soruya bir cevabınız varsa lütfen onu ekleyin ve nasıl uygulayacağınıza dair biraz ayrıntı verin.
Eric Hodonsky

3
@MuhammadUmer veya sadece bir bağlantı etiketi kullanın. react-router, yalnızca uygulamanızın içinde yönlendirme içindir. O tasarım kararı (biliyorum katılmıyorum olabilir ben sadece aynı bitti, do), ancak "1999 yılında daha iyisini" değil.
worc

Harici siteye yönlendirirken URL'yi HTTP Durum koduyla birlikte dinamik olarak da iletmek istersek ne olur? Bir örnek aldım, ancak ihtiyacımla net değil gist.github.com/arasmussen/f2c01dc858481590f6bffae6b540632c
Krishna Mani

21

React router talep etmesine gerek yoktur. Bu işlem yerel olarak yapılabilir ve tarayıcı tarafından sağlanır.

sadece kullan window.location

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

1
Bu cevap eksik, soyutlamaya izin vermiyor veya yönlendiriciyle ilişkisi
Eric Hodonsky

8
Amaç bu. React router talep etmesine gerek yoktur. Bu işlem yerel olarak yapılabilir ve tarayıcı tarafından sağlanır.
Alan

Harici siteye yönlendirirken URL'yi HTTP Durum koduyla birlikte dinamik olarak da iletmek istersek ne olur? Bir örnek aldım, ancak ihtiyacım net değil. gist.github.com/arasmussen/f2c01dc858481590f6bffae6b540632c
Krishna Mani

14

React-router'ın Link bileşeni ile bunu yapabilirsiniz. In " için verilerin 3 türlerini belirtebilirsiniz desteklemek":

  • a string : Konumun yol adı, arama ve karma özellikleri birleştirilerek oluşturulan Bağlantı konumunun bir dize temsili.
  • bir nesne : Aşağıdaki özelliklerden herhangi birine sahip olabilen bir nesne:
    • yol adı : Bağlanılacak yolu temsil eden bir dize.
    • arama : Sorgu parametrelerinin dize temsili.
    • hash : URL'ye yerleştirilecek bir hash, örneğin # a-hash.
    • durum : Konumda kalıcı olmak için durum.
  • a işlev : Geçerli konumun argüman olarak iletildiği ve konum gösterimini bir dizge veya nesne olarak döndürmesi gereken bir işlev

Örneğiniz için (harici bağlantı):

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

Aşağıdakileri yapabilirsiniz:

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

Ayrıca bir başlık, kimlik, sınıf adı vb. Gibi olmasını istediğiniz unsurları da iletebilirsiniz.


5

Buradaki bazı bilgileri kullanarak, rota bildirimlerinizde kullanabileceğiniz aşağıdaki bileşeni buldum. React Router v4 ile uyumludur.

Typcript kullanıyor, ancak yerel javascript'e dönüştürmek oldukça kolay olmalı:

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;
      }}
    />
  );
};

Ve şununla kullanın:

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

3

Şansım yaver gitti:

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

1

React-Router'ın bu desteği sağladığını sanmıyorum. belgeler söz

<Yeniden Yönlendir> , eski URL'leri korumak için uygulamanızda başka bir yola yönlendirme kurar .

Bunun yerine React-Redirect gibi bir şey kullanmayı deneyebilirsiniz


1

Alan'ın cevabını genişletmek için, "http:" veya "https:" içeren "to" özniteliklerine sahip olanları doğru harici kaynağa <Route/>yeniden yönlendiren bir tane oluşturabilirsiniz <Link/>.

Aşağıda, doğrudan sizin sayfanıza yerleştirilebilecek çalışan bir örnek bulunmaktadır <Router>.

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

0

V3 İÇİN, ancak V4 için çalışabilir. Eric'in cevabından yola çıkarak, url'de "http" nin bulunmadığı yerel geliştirmeyi ele almak gibi biraz daha yapmam gerekiyordu. Aynı sunucudaki başka bir uygulamaya da yönlendiriyorum.

Yönlendirici dosyasına eklendi:

import RedirectOnServer from './components/RedirectOnServer';

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

Ve Bileşen:

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;

-1

React'i Typescript ile kullandığınızda bir hata alırsınız çünkü fonksiyon bir react elemanı döndürmemelidir, döndürmez void. Bu yüzden, Route oluşturma yöntemini kullanarak (ve React yönlendirici v4 kullanarak) bu şekilde yaptım:

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

Bunun yerine aynı zamanda kullanabilirsiniz nerede window.location.assign(), window.location.replace()vb


-2

Sunucu tarafı yönlendirmeyi kullanıyorsanız kullanabilirsiniz StaticRouter. Senin ile contextolduğu gibi propsve daha sonra ekleme <Redirect path="/somewhere" />uygulamanızda bileşeni. Buradaki fikir, react-router'ın bir yönlendirme bileşeniyle eşleştiği her seferinde, yolunuzun bir yönlendirme bileşeni ile eşleştiğini size bildirmek için statik yönlendiriciye geçirdiğiniz bağlama bir şeyler ekleyeceğidir. Artık bir yönlendirmeye bastığınızı bildiğinize göre, aradığınız yönlendirmenin bu olup olmadığını kontrol etmeniz yeterlidir. sonra sadece sunucu üzerinden yönlendirin. ctx.redirect('https://example/com').


Müşteride bunu yapmanın bir yolunu istiyorum. Doğru yapılırsa, aslında DNS düzeyinde yapılmalıdır. İkincisi, ilk sunucu isteğinde olacaktır. S3'te barındırdığım için sunucu tarafı yok. Bu yüzden, geliştirme görevlimiz yeniden yönlendirmeyi Hizmet Seviyesinde yapana kadar şimdilik sıkışmış durumdayım.
Eric Hodonsky

ne yapabilirsin,<Redirect push={ true } to="/pathtoredirect" />
Rei Dien

-4

Aşağıdakileri kullanarak react-router-dom'da bir yönlendirme elde edebildim

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

Benim durumum için, kullanıcıları kök URL'yi her ziyaret ettiklerinde http://myapp.comuygulama içinde başka bir yere yönlendirmenin bir yolunu arıyordum http://myapp.com/newplace. bu yüzden yukarıdakiler yardımcı oldu.


2
OP, aynı uygulama içindeki bir rotaya değil, harici bir kaynağa yönlendirmeye çalıştığını açıkça belirtir.
Neets

Açıkçası, kullanım durumum hakkında spesifik davrandım ve kendi kendine uygulayabilirse bunu düşürdüm. benim çözümüm uygulamamda bunu bir örnek olarak kullanabileceğini söylüyor.
walecloud

1
Kullanım durumunuzu insanlara sergilemek istiyorsanız, lütfen bununla ilgili bir blog yazın. Stackoverflow, kullanım durumunuz değil, insanların sahip olduğu sorguyu yanıtlamak içindir. Ayrıca, kullanım durumunuzu uygulamanın doğru yolu - <Redirect from = "/" to = {{pathname: '/ YourRoute'}} />
Abhas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.