Geçmiş yönlendiricisi v4'te history.push / Link / Redirect ile paramlar nasıl iletilir?


217

this.props.history.push('/page')React-Router v4 ile parametreyi nasıl geçirebiliriz ?

.then(response => {
       var r = this;
        if (response.status >= 200 && response.status < 300) {
             r.props.history.push('/template');
          });

Bir tarafından oluşturulur bileşen Routeerişimi olmalıdır this.props.location, this.props.historyvb ben kullanmak gerekmez düşünüyorum refv4 ile artık. this.props.history.push('/template');
— Yapmayı

Ref değil, buna işaret eden değişkendir; ( '/ şablon') this.props.history.push; beni sonraki sayfaya götürün ama onlarla sahne geçmek istiyorum .ref = this;
— IshanGarg

Rotayla propseşleşen bileşene geçmeye mi çalışıyorsunuz ? Bu GitHub iş parçacığının endişenizi giderdiğini düşünüyorum .
— saadq

JFYI - <a href> 'i kaldırdım ve durum gönderme seçeneği de bulunan <Link>' i ekledim.
— Manohar Reddy Poreddy

Lütfen cevaplardan birini 'cevap' olarak işaretler misiniz? Eminim onları yazmak için zaman harcayan insanlar bunu takdir edecektir.
— James Poulose

Yanıtlar:


392

Her şeyden önce, yapmanız gerekmez var r = this;bu in gibiif statement callback'inde kendisi bağlamında atıfta bileşen bağlamı Tepki atıfta hangi ok fonksiyonu kullanılarak beri.

Dokümanlara göre:

geçmiş nesneleri genellikle aşağıdaki özelliklere ve yöntemlere sahiptir:

  • uzunluk - (sayı) Geçmiş yığınındaki giriş sayısı
  • action - (dize) Geçerli eylem (PUSH, REPLACE veya POP)
  • location - (nesne) Geçerli konum. Aşağıdaki özelliklere sahip olabilir:

    • pathname - (dize) URL'nin yolu
    • arama - (dize) URL sorgu dizesi
    • hash - (dize) URL karma parçası
    • durum - (konum) yığına itildiğinde itme (yol, durum) için sağlanan konuma özgü durum. Yalnızca tarayıcı ve bellek geçmişinde kullanılabilir.
  • push (yol, [durum]) - (işlev) Geçmiş yığınına yeni bir giriş iter
  • replace (path, [state]) - (işlev) Geçmiş yığınındaki geçerli girişi değiştirir
  • go (n) - (işlev) Geçmiş yığınındaki işaretçiyi n girişle taşır
  • goBack () - (işlev) Gitmeye eşdeğer (-1)
  • goForward () - (işlev) Gitmeye eşdeğer (1)
  • block (istemi) - (işlev) Gezinmeyi önler

Böylece navigasyon yaparken, sahne nesnesini

this.props.history.push({
  pathname: '/template',
  search: '?query=abc',
  state: { detail: response.data }
})

veya benzer şekilde Linkbileşen veya Redirectbileşen için

<Link to={{
      pathname: '/template',
      search: '?query=abc',
      state: { detail: response.data }
    }}> My Link </Link>

ve sonra /templaterota ile oluşturulan bileşende , aşağıdaki gibi geçirilen desteklere erişebilirsiniz

this.props.location.state.detail

Ayrıca, sahne malzemelerinden geçmiş veya konum nesnelerini kullanırken bileşeni bağlamanız gerektiğini unutmayın withRouter.

Dokümanlara göre:

withRouter

Geçmiş nesnesinin özelliklerine ve en yakın <Route>'seşleşmeye withRouterüst düzey bileşen aracılığıyla erişebilirsiniz . withRouter rota <Route>render ile aynı sahne ile her değiştiğinde bileşenini yeniden oluşturur props: { match, location, history }.


3
Evet, işe yaradı. Ama neden this.props.history.push('/template',response.data)çalışmadığından emin değilim. Dokümanlarına göre push(path, [state]), bunun çalışması gerektiğini düşünmüyor musunuz?
— Sanket Patel

1
Bunun için teşekkürler! Benim durumumda sadece tarihi doğrudan geçiyordum, bu yüzden propime bu.props.history.location.state.propName -
— Nunchucks'a

@SanketPatel bunu yapmanız gerekiyor this.props.history.push ('/ template', {response: response.data})
— Arsalan Ahmed Quershi

Hareket halindeyken durum değişkenine veri aktarırken rotayı yeni bir sekmede açmak, sahne nesnesine sahne geçmesi mümkün mü?
— Gaurav Kumar

3
goBack () ne olacak? goBack () ile geri giderken, props.location veya props.history.location öğelerinde geçmiş durumlarını göremiyorum. Push () ile ileriye doğru navigasyon iyi çalışıyor
— MariusB

40

kullanabilirsiniz,

this.props.history.push("/template", { ...response }) veya this.props.history.push("/template", { response: response })

ayrıştırılan verilere /templateaşağıdaki kodu kullanarak bileşenden erişebilirsiniz ,

const state = this.props.location.state

React Session History Management hakkında devamını oku


Bu mantık benim için işe yaradı. ve bunu this.props.location.state.back_url tarafından açılış sayfasına getirme
— Braham Dev Yadav

24
  • İçin önceki sürümleri:

    history.push('/path', yourData);

    Ve aşağıdaki gibi ilgili bileşendeki verileri alın:

    this.props.location.state // it is equal to yourData
  • Daha yeni sürümler için yukarıdaki yol iyi çalışır, ancak yeni bir yol vardır:

    history.push({
      pathname: '/path',
      customNameData: yourData,
    });

    Ve aşağıdaki gibi ilgili bileşendeki verileri alın:

    this.props.location.customNameData // it is equal to yourData

İpucu : stateAnahtar adı önceki sürümlerde kullanıldı ve daha yeni sürümler için, özel adınızı veri iletmek için kullanabilirsiniz ve statead kullanmak gerekli değildir.


eğer kullanışlı olursanız, devletin gerekli olmadığını söyleyen referansı paylaşın
— Akshay Vijay Jain

Sevgili @AkshayVijayJain, bu benim kodlama deneyimim. Bu cümleyi bir dokümana veya referansa dayanarak yazmadım.
— AmerllicA

22

Reaksiyon kancalarıyla (16.8 sonrası) kullanım için çözeltinin (Shubham Khatri tarafından önerilen) genişletilmesi:

package.json (always worth updating to latest packages)

{
     ...

     "react": "^16.12.0",
     "react-router-dom": "^5.1.2",

     ...
}

Geçmiş push ile parametreleri iletme:

import { useHistory } from "react-router-dom";

const FirstPage = props => {
    let history = useHistory();

    const someEventHandler = event => {
       history.push({
           pathname: '/secondpage',
           search: '?query=abc',
           state: { detail: 'some_value' }
       });
    };

};

export default FirstPage;

'Reat-router-dom' öğesinden useLocation öğesini kullanarak iletilen parametreye erişme:

import { useEffect } from "react";
import { useLocation } from "react-router-dom";

const SecondPage = props => {
    const location = useLocation();

    useEffect(() => {
       console.log(location.pathname); // result: '/secondpage'
       console.log(location.search); // result: '?query=abc'
       console.log(location.state.detail); // result: 'some_value'
    }, [location]);

};

Çok teşekkür ederim, cevabınız dışında güncellenmiş bir alternatif bulamadınız!
— jamezrin

10

URL parametrelerini iletmeniz gerekiyorsa

sitesinde Tyler McGinnis'in harika bir yazı açıklaması var, mesaja Bağlantı

İşte kod örnekleri:

  1. history.push bileşeninde:

    this.props.history.push(`/home:${this.state.userID}`)

  2. yönlendirici bileşeninde rotayı tanımlarsınız:

    <Route path='/home:myKey' component={Home} />

  3. Home bileşeninde:

componentDidMount(){
    const { myKey } = this.props.match.params
    console.log(myKey )
}

Ben böyle bir şey var, ama ben sayfayı yenilerseniz tamamen çöküyor
— rabiaasif

@rabiaasif çünkü veriler artık orada olmadığından, devam
— ettirmeniz

3

Yönlendirici ile kullanmak gerekli değildir. Bu benim için çalışıyor:

Ana sayfanızda,

<BrowserRouter>
   <Switch>
        <Route path="/routeA" render={(props)=> (
          <ComponentA {...props} propDummy={50} />
        )} />

        <Route path="/routeB" render={(props)=> (
          <ComponentB {...props} propWhatever={100} />
          )} /> 
      </Switch>
</BrowserRouter>

Ardından, Bileşen A veya BileşenB'de şunlara erişebilirsiniz:

this.props.history

this.props.history.push yöntemini içeren nesne.


Sanırım ihtiyacın yoktu withRouterçünkü bileşenini BrowserRouteraynı şekilde işledin.
— Pie 'Oh' Pah

Evet ve pervaneyi propsiçeren her bileşene historyiniyorsunuz.
— Jeremy

2

Kullanım için 16.8+ (withHooks) Tepki bu şekilde kullanabilirsiniz

import React from 'react';
import { useHistory } from 'react-router-dom';

export default function SomeFunctionalComponent() {
let history = useHistory(); // should be called inside react component

const handleClickButton = () => {    
"funcionAPICALL"
       .then(response => {
             if (response.status >= 200 && response.status < 300) {
                 history.push('/template');
              });
}

return ( <div> Some component stuff 
    <p>To make API POST request and redirect to "/template" click a button API CALL</p>
    <button onClick={handleClickButton}>API CALL<button>
</div>)
} 

Daha fazla bilgi edinmek için buraya kaynak https://reacttraining.com/react-router/web/example/auth-workflow


-12

Sorgu parametrelerini almak için bilgi ekleyin.

const queryParams = new URLSearchParams(this.props.location.search);
console.log('assuming query param is id', queryParams.get('id');

URLSearchParams hakkında daha fazla bilgi için bu bağlantıyı kontrol edin URLSearchParams


1
Bu, React Router 4 ile hiç ilgili değil.
— Colby Cox
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.