W bieżącej wersji React Router (v3) mogę zaakceptować odpowiedź serwera i użyć, browserHistory.push
aby przejść do odpowiedniej strony odpowiedzi. Nie jest to jednak dostępne w wersji 4 i nie jestem pewien, jaki jest właściwy sposób obsługi tego.
W tym przykładzie przy użyciu Redux wywołanie składników / app-product-form.jsthis.props.addProduct(props)
po przesłaniu formularza przez użytkownika. Gdy serwer zwróci sukces, użytkownik zostaje przeniesiony na stronę koszyka.
// actions/index.js
export function addProduct(props) {
return dispatch =>
axios.post(`${ROOT_URL}/cart`, props, config)
.then(response => {
dispatch({ type: types.AUTH_USER });
localStorage.setItem('token', response.data.token);
browserHistory.push('/cart'); // no longer in React Router V4
});
}
Jak mogę przekierować na stronę Koszyk z funkcji React Router v4?
context
ręcznego przekazania tego, czego potrzebujesz ręcznie, jest „nie do zrobienia”. O ile nie jestem autorem biblioteki, nie powinno być potrzeby jej używania. W rzeczywistości Facebook odradza to.history
działa również dla React Native jako opcja, a także dodatkowa opcja obsługi starszych przeglądarek.Odpowiedzi:
Możesz korzystać z
history
metod poza komponentami. Spróbuj w następujący sposób.Najpierw utwórz
history
obiekt wykorzystujący pakiet historii :Następnie zawiń go
<Router>
( pamiętaj , że powinieneś użyćimport { Router }
zamiastimport { BrowserRouter as Router }
):Zmień swoją bieżącą lokalizację z dowolnego miejsca, na przykład:
UPD : Możesz również zobaczyć nieco inny przykład w React Router FAQ .
źródło
history.push('some path')
adres URL się zmienia, ale strona się nie zmienia. Muszę umieścićwindow.location.reload()
go w niektórych częściach mojego kodu, aby działał. Jednak w jednym przypadku muszę zachować drzewo stanu redux i przeładowanie go niszczy. Jakieś inne rozwiązanie?withRouter
komponentu wyższego rzędu.import createHistory from 'history/createBrowserHistory'; export default createHistory();
będzie praca.React Router v4 zasadniczo różni się od v3 (i wcześniejszych) i nie możesz robić tego,
browserHistory.push()
co kiedyś.Ta dyskusja wydaje się powiązana, jeśli chcesz uzyskać więcej informacji:
Zamiast tego masz kilka opcji:
Użyj
withRouter
komponentu wyższego rzęduZamiast tego należy użyć
withRouter
komponentu wyższego rzędu i zawinąć go w komponent, który przejdzie do historii. Na przykład:Sprawdź oficjalną dokumentację, aby uzyskać więcej informacji:
Użyj
context
interfejsu APIKorzystanie z kontekstu może być jednym z najprostszych rozwiązań, ale jako eksperymentalny interfejs API jest niestabilny i nie jest obsługiwany. Używaj go tylko wtedy, gdy wszystko inne zawiedzie. Oto przykład:
Zobacz oficjalną dokumentację dotyczącą kontekstu:
źródło
this.context.router.history.push('/path');
Teraz z React-Router v5 możesz użyć haka cyklu życia useHistory w następujący sposób:
czytaj więcej na: https://reacttraining.com/react-router/web/api/Hooks/usehistory
źródło
let history = useHistory();
aleObject is not callable
pojawia się błąd, kiedy próbowałem zobaczyć, co to useHistoryconsole.log(useHistory)
to pokazuje się jako niezdefiniowane. using"react-router-dom": "^5.0.1"
Najprostszym sposobem w React Router 4 jest użycie
Ale aby skorzystać z tej metody, istniejący komponent powinien mieć dostęp do
history
obiektu. Możemy uzyskać dostęp przezJeśli twój komponent jest
Route
bezpośrednio połączony, oznacza to , że ma on już dostęp dohistory
obiektu.na przykład:
Tutaj
ViewProfile
ma dostęp dohistory
.Jeśli nie jest podłączony
Route
bezpośrednio.na przykład:
Następnie musimy zastosować
withRouter
wyższą kolejność, aby wypaczać istniejący komponent.ViewUsers
Element wewnętrznyimport { withRouter } from 'react-router-dom';
export default withRouter(ViewUsers);
To wszystko, Twój
ViewUsers
komponent ma dostęp dohistory
obiektu.AKTUALIZACJA
2
- w tym scenariuszu przekaż całą trasęprops
do swojego komponentu, a następnie będziemy mogli uzyskać dostępthis.props.history
z komponentu nawet bezHOC
na przykład:
źródło
this.props.history
załatwiła sprawę , ponieważ mój komponent (który wymaga dostępu ) pochodzi z HOC, co oznacza, że nie jest on bezpośrednio powiązany zRoute
, jak wyjaśniono.Oto jak to zrobiłem:
Skorzystaj
this.props.history.push('/cart');
z przekierowania do strony koszyka, która zostanie zapisana w obiekcie historii.Ciesz się, Michael.
źródło
Zgodnie z dokumentacją React Router v4 - sesja głębokiej integracji Redux
Konieczna jest głęboka integracja, aby:
Zalecają jednak to podejście jako alternatywę dla „głębokiej integracji”:
Możesz więc owinąć swój komponent za pomocą komponentu withRouter:
export default withRouter(connect(null, { actionCreatorName })(ReactComponent));
który przekaże interfejs API historii do rekwizytów. Możesz więc zadzwonić do twórcy akcji, który przekazuje historię jako param. Na przykład wewnątrz ReactComponent:
Następnie wewnątrz akcji / index.js:
źródło
Paskudne pytanie zajęło mi sporo czasu, ale ostatecznie rozwiązałem to w ten sposób:
Zawiń swój kontener
withRouter
i przekaż historię swojej akcji wmapDispatchToProps
funkcji. W akcji nawiguj za pomocą history.push ('/ url').Akcja:
Pojemnik:
Jest to ważne dla React Router v4.x .
źródło
import { createBrowserHistory } from 'history'
pomysłem, proszę?this.context.history.push
nie będzie działać.Udało mi się uzyskać push działający w następujący sposób:
źródło
W tym przypadku przekazujesz rekwizyty swojemu thunkowi. Możesz więc po prostu zadzwonić
Jeśli tak nie jest, nadal możesz przekazać historię ze swojego komponentu
źródło
Oferuję jeszcze jedno rozwiązanie na wypadek, gdyby było to dla kogoś warte.
Mam
history.js
plik, w którym mam następujące elementy:Następnie w moim katalogu głównym, w którym definiuję router, używam:
Na koniec
actions.js
importuję Historię i korzystam z pushLaterW ten sposób mogę wywoływać nowe działania po wywołaniach API.
Mam nadzieję, że to pomoże!
źródło
Jeśli używasz Redux, to polecam użycie pakietu npm reaguj-router-redux . Umożliwia wysyłanie akcji nawigacyjnych sklepu Redux.
Musisz utworzyć sklep zgodnie z opisem w pliku Readme .
Najłatwiejszy przypadek użycia:
Drugi przypadek użycia z pojemnikiem / komponentem:
Pojemnik:
Składnik:
źródło
next
wersji, która jest wciąż w fazie rozwoju!Udało mi się to osiągnąć za pomocą
bind()
. Chciałem kliknąć przyciskindex.jsx
, opublikować dane na serwerze, ocenić odpowiedź i przekierować nasuccess.jsx
. Oto jak to wypracowałem ...index.jsx
:request.js
:success.jsx
:Więc łącząc się
this
zpostData
inindex.jsx
, mogłem uzyskać dostępthis.props.history
dorequest.js
... wtedy mogę ponownie użyć tej funkcji w różnych komponentach, po prostu upewnij się, że pamiętam o dołączeniuthis.postData = postData.bind(this)
doconstructor()
.źródło
Oto mój hack (to jest mój plik na poziomie root, z dodanym trochę redux - choć nie używam
react-router-redux
):Mogę wtedy używać
window.appHistory.push()
gdziekolwiek chcę (na przykład w moich funkcjach sklepu redux / thunks / sagas itp.) Miałem nadzieję, że mogę po prostu użyć,window.customHistory.push()
ale z jakiegoś powodureact-router
nigdy nie wydawałem się aktualizować, nawet jeśli zmieniłem adres URL. Ale w ten sposób korzystam z instancji EXACTreact-router
. Nie uwielbiam umieszczać rzeczy w zasięgu globalnym i jest to jedna z niewielu rzeczy, które bym to zrobił. Ale to lepsze niż jakakolwiek inna alternatywa, jaką widziałem w IMO.źródło
Użyj oddzwaniania. To zadziałało dla mnie!
W komponencie wystarczy dodać oddzwonienie
źródło
więc tak to robię: - zamiast przekierowywania za pomocą
history.push
, po prostu używamRedirect
komponentu zreact-router-dom
Podczas korzystania z tego komponentu możesz po prostu przekazaćpush=true
, a zajmie się resztąźródło
Router React V4 pozwala teraz na użycie rekwizytu historii w następujący sposób:
Dostęp do tej wartości można uzyskać wszędzie tam, gdzie prop położenie jest dostępny jako
state:{value}
stan inny niż komponent.źródło
możesz użyć tego w ten sposób, ponieważ robię to do logowania i wiele innych rzeczy
źródło
źródło
krok pierwszy zawiń aplikację w Router
Teraz moja cała aplikacja będzie miała dostęp do BrowserRouter. Krok drugi Importuję trasę, a następnie przekazuję te rekwizyty. Prawdopodobnie w jednym z twoich głównych plików.
Teraz, jeśli uruchomię plik console.log (this.props) w pliku js komponentu, powinienem otrzymać coś, co wygląda tak
Krok 2 Mogę uzyskać dostęp do obiektu historii, aby zmienić moją lokalizację
Jestem także studentem kodowania bootcamp, więc nie jestem ekspertem, ale wiem, że możesz także użyć
Popraw mnie, jeśli się mylę, ale kiedy to przetestowałem, przeładowało całą stronę, co, jak sądzę, pokonało cały sens używania React.
źródło
Utwórz niestandardowy
Router
własnybrowserHistory
:Następnie w
Router
katalogu głównym , w którym zdefiniujesz swój , użyj następujących poleceń:Na koniec zaimportuj
history
tam, gdzie jest to potrzebne i użyj:źródło
Jeśli chcesz użyć historii podczas przekazywania funkcji jako wartości do rekwizytu komponentu, za pomocą routera reagującego 4 możesz po prostu zniszczyć
history
rekwizyt w atrybucie renderowania<Route/>
komponentu, a następnie użyćhistory.push()
Uwaga: Aby to zadziałało, należy owinąć komponent React Router BrowserRouter wokół głównego komponentu (np. Który może znajdować się w pliku index.js)
źródło