Więcej
Programowa nawigacja przy użyciu routera react
Dzięki react-router
mogę używać elementu Link
do tworzenia linków, które są natywnie obsługiwane przez react router.
Widzę, że wewnętrznie wywołuje on this.context.transitionTo(...)
.
Chcę zrobić nawigację, ale nie z linku, z rozwijanego wyboru na przykład. Jak mogę to zrobić w kodzie? Czym jest this.context
?
Widziałem mixin Navigation
, ale czy mogę to zrobić bez mixinów?
1245
3
Możesz użyć nowego haka
useHistory
na komponentach funkcjonalnych i programowo nawigować:W wersji 4.0 i wyższych, użyj historii jako rekwizytu swojego komponentu.
UWAGA: this.props.history nie istnieje w przypadku, gdy twój komponent nie został wyrenderowany przez
. Powinieneś użyć
aby mieć this.props.history w TwoimKomponencie.W wersji 3.0 i wyższych, używaj routera jako rekwizytu swojego komponentu.
W wersji 2.4 i wyższych, użyj komponentu wyższego rzędu, aby uzyskać router jako rekwizyt twojego komponentu.
Ta wersja jest wstecznie kompatybilna z 1.x, więc nie ma potrzeby korzystania z przewodnika aktualizacji. Samo zapoznanie się z przykładami powinno wystarczyć.
Jeśli jednak chcesz przejść na nowy wzorzec, wewnątrz routera znajduje się moduł browserHistory, do którego można uzyskać dostęp za pomocą polecenia
import { browserHistory } from 'react-router'`.
Teraz masz dostęp do historii przeglądarki, więc możesz robić rzeczy takie jak push, replace, itp... Jak:
browserHistory.push('/some/path')
.Dalsze czytanie: Historie i Nawigacja
Nie będę zagłębiał się w szczegóły aktualizacji. Możesz przeczytać o tym w Przewodniku aktualizacji
Główną zmianą dotyczącą pytania tutaj jest zmiana z Navigation mixin na History. Teraz to's używa historyAPI przeglądarki do zmiany trasy, więc będziemy używać
pushState()
od teraz.Oto przykład z użyciem Mixin:
Zauważ, że ta
Historia
pochodzi z projektu rackt/history. Nie z samego React-Routera.Jeśli nie chcesz używać Mixina z jakiegoś powodu (być może z powodu klasy ES6), możesz uzyskać dostęp do historii, którą otrzymujesz z routera z
this.props.history
. Będzie ona dostępna tylko dla komponentów renderowanych przez twój Router. Tak więc, jeśli chcesz użyć go w komponentach potomnych, musi on być przekazany jako atrybut przezprops
.Możesz przeczytać więcej o nowym wydaniu na ich 1.0.x documentation
Tutaj jest strona pomocy dotycząca nawigacji poza komponentem
Zaleca ona złapanie referencji
history = createHistory()
i wywołaniereplaceState
na tym.Wpadłem na ten sam problem i mogłem znaleźć rozwiązanie tylko za pomocą miksinu Navigation, który jest dostarczany z react-router.
Oto'jak to zrobiłem
Byłem w stanie wywołać
transitionTo()
bez potrzeby dostępu do.context
.Lub możesz spróbować wymyślnej ES6
klasy
.React-Router-Redux ma kilka dostępnych metod, które pozwalają na prostą nawigację z wnętrza twórców akcji. Mogą one być szczególnie przydatne dla osób, które mają istniejącą architekturę w React Native, i chcą wykorzystać te same wzorce w React Web z minimalnym narzutem kotła.
Zapoznaj się z następującymi metodami:
push(location)
replace(location)
go(liczba)
goBack()
goForward()
Oto przykład użycia, z Redux-Thunk:
./actioncreators.js.
./viewcomponent.js
W najnowszym wydaniu (
v2.0.0-rc5
), zalecaną metodą nawigacji jest bezpośrednie pchanie do singletonu historii. Możesz zobaczyć to w akcji w Nawigacja poza komponentami doc.Odpowiedni fragment:
Jeśli używasz nowszego API react-router, musisz wykorzystać
history
zthis.props
, gdy wewnątrz komponentów tak:Oferuje on również
pushState
, ale jest to już przestarzałe, jeśli chodzi o zarejestrowane ostrzeżenia.Jeśli używasz
react-router-redux
, oferuje on funkcjępush
, którą możesz wysłać w ten sposób:Jednak może to być użyte tylko do zmiany adresu URL, a nie do faktycznej nawigacji na stronę.
Możesz to zrobić również bez mixins.
Problem z kontekstami polega na tym, że nie są one dostępne, chyba że zdefiniujesz
contextTypes
na klasie.Jeśli chodzi o to, czym jest kontekst, jest to obiekt, podobnie jak rekwizyty, które są przekazywane z rodzica na dziecko, ale jest on przekazywany niejawnie, bez konieczności ponownego deklarowania rekwizytów za każdym razem. Zobacz https://www.tildedave.com/2014/11/15/introduction-to-contexts-in-react-js.html