Czy ktoś może mi powiedzieć, jak mogę wrócić do poprzedniej strony zamiast określonej trasy?
Używając tego kodu:
var BackButton = React.createClass({
mixins: [Router.Navigation],
render: function() {
return (
<button
className="button icon-left"
onClick={this.navigateBack}>
Back
</button>
);
},
navigateBack: function(){
this.goBack();
}
});
Pobierz ten błąd, goBack () został zignorowany, ponieważ nie ma historii routera
Oto moje trasy:
// Routing Components
Route = Router.Route;
RouteHandler = Router.RouteHandler;
DefaultRoute = Router.DefaultRoute;
var routes = (
<Route name="app" path="/" handler={OurSchoolsApp}>
<DefaultRoute name="home" handler={HomePage} />
<Route name="add-school" handler={AddSchoolPage} />
<Route name="calendar" handler={CalendarPage} />
<Route name="calendar-detail" path="calendar-detail/:id" handler={CalendarDetailPage} />
<Route name="info-detail" path="info-detail/:id" handler={InfoDetailPage} />
<Route name="info" handler={InfoPage} />
<Route name="news" handler={NewsListPage} />
<Route name="news-detail" path="news-detail/:id" handler={NewsDetailPage} />
<Route name="contacts" handler={ContactPage} />
<Route name="contact-detail" handler={ContactDetailPage} />
<Route name="settings" handler={SettingsPage} />
</Route>
);
Router.run(routes, function(Handler){
var mountNode = document.getElementById('app');
React.render(<Handler /> , mountNode);
});
javascript
reactjs
react-router
Bombowiec
źródło
źródło
Odpowiedzi:
Myślę, że po prostu trzeba włączyć BrowserHistory na routerze przez intializing to tak:
<Router history={new BrowserHistory}>
.Wcześniej powinieneś wymagać
BrowserHistory
od'react-router/lib/BrowserHistory'
Mam nadzieję że to pomogło !
UPDATE: przykład w ES6
źródło
this.props.history
. Tak więc kod staje sięthis.props.history.goBack
Aktualizacja za pomocą React v16 i ReactRouter v4.2.0 (październik 2017):
Aktualizacja za pomocą React v15 i ReactRouter v3.0.0 (sierpień 2016):
Utworzono skrzypce z nieco bardziej złożonym przykładem z osadzonym iframe: https://jsfiddle.net/kwg1da3a/
React v14 i ReacRouter v1.0.0 (10 września 2015)
Możesz to zrobić:
Musisz uważać, aby mieć historię niezbędną do powrotu. Jeśli wejdziesz na stronę bezpośrednio, a następnie wrócisz, przeniesie Cię z powrotem do historii przeglądarki przed aplikacją.
To rozwiązanie zajmie się obydwoma scenariuszami. Nie będzie jednak obsługiwać elementu iframe, który może poruszać się po stronie (i dodawać do historii przeglądarki) za pomocą przycisku Wstecz. Szczerze mówiąc, myślę, że to błąd w routerze reagującym. Problem utworzono tutaj: https://github.com/rackt/react-router/issues/1874
źródło
import
withRouter
Wyeksportuj swój komponent jako:
Przykład, po kliknięciu przycisku zadzwoń
goBack
:Testowane w wersji
react-router-dom
4.3źródło
withRouter
. Może po prostu używamy natywnego interfejsu API historii przeglądarki. Ale czy to w porządku?Nie wymaga połączenia nawigacji!
źródło
this.context.router.history.goBack
. (+ historia)import { withRouter } from 'react-router-dom';
współpracuje zthis.props.history.goBack();
Metoda ES6 bez mikserów z wykorzystaniem routera reagującego, funkcja bezstanowa.
źródło
export 'browserHistory' was not found in 'react-router'
Używanie haków React
Import:
W komponencie bezstanowym:
Na wydarzeniu
źródło
Posługiwać się
withRouter
ihistory.goBack()
To jest idea, którą wdrażam ...
History.js
PageOne.js
ps przepraszam, że kod jest za duży, aby opublikować wszystko tutaj
źródło
go
funkcjihistory.go(+1)
:?history.go(1)
powinno wystarczyć.Działa to z historią przeglądarki i skrótu.
źródło
To jest działający komponent BackButton (React 0.14):
Oczywiście możesz zrobić coś takiego, jeśli nie ma historii:
źródło
Zmieniło się to w przypadku act-router v2.x. Oto, co robię dla ES6:
źródło
W React-router v4.x możesz użyć
history.goBack
odpowiednikahistory.go(-1)
.App.js
Back.js
Próbny: https://codesandbox.io/s/ywmvp95wpj
Pamiętaj, że korzystając
history
z usług użytkownicy mogą opuścić witrynę, ponieważhistory.goBack()
mogą załadować stronę, którą odwiedził odwiedzający przed otwarciem aplikacji.Aby zapobiec takiej sytuacji jak opisana powyżej, stworzyłem prostą bibliotekę reaguj-router-ostatnia-lokalizacja która obserwuje ostatnią lokalizację użytkowników.
Użycie jest bardzo proste. Najpierw musisz zainstalować
react-router-dom
ireact-router-last-location
odnpm
.Następnie użyj
LastLocationProvider
jak poniżej:App.js
Back.js
Demo: https://codesandbox.io/s/727nqm99jj
źródło
lastLocation
poza Reactem, czy może mówiącI'd like to use it programmatically
, czy chcesz po prostu mieć możliwość importowaniaimport { lastLocation } from '...'
?To, co zadziałało, to importowanie z routerem na początku mojego pliku;
Następnie użyj go do zawinięcia wyeksportowanej funkcji na dole mojego pliku;
Dzięki temu uzyskałem dostęp do właściwości historii routera. Pełny przykładowy kod poniżej!
źródło
Wróć do określonej strony :
Wróć do poprzedniej strony:
źródło
Używam tych wersji
źródło
Jedyne rozwiązanie, które działało u mnie, było najprostsze. Nie jest potrzebny dodatkowy import.
Tks, IamMHussain
źródło
Wywołaj następujący komponent w ten sposób:
A oto składnik:
Używam:
źródło
Możesz także użyć
react-router-redux
które magoBack()
ipush()
.Oto pakiet samplerów do tego:
W punkcie wejścia aplikacji potrzebujesz
ConnectedRouter
, a czasem trudnym do podłączenia jesthistory
obiekt. Oprogramowanie pośredniczące Redux nasłuchuje zmian w historii:Pokażę ci sposób podłączenia
history
. Zwróć uwagę, jak historia jest importowana do sklepu, a także eksportowana jako singleton, dzięki czemu można jej użyć w punkcie wejścia aplikacji:Powyższy przykładowy blok pokazuje, jak załadować
react-router-redux
pomocników oprogramowania pośredniego, które kończą proces instalacji.Myślę, że ta następna część jest zupełnie dodatkowa, ale dołączę ją na wypadek, gdyby ktoś w przyszłości znalazł korzyści:
Używam
routerReducer
cały czas, ponieważ pozwala mi to wymusić przeładowanie komponentów, które normalnie nie powodująshouldComponentUpdate
. Oczywistym przykładem jest pasek nawigacji, który ma się aktualizować, gdy użytkownik naciśnieNavLink
przycisk. Jeśli pójdziesz tą drogą, dowiesz się, że metoda łączenia Redux wykorzystujeshouldComponentUpdate
. DziękirouterReducer
, możesz użyćmapStateToProps
mapować zmiany tras na pasku nawigacyjnym, co spowoduje jego aktualizację, gdy zmieni się obiekt historii.Lubię to:
Wybacz mi, dodam kilka dodatkowych słów kluczowych dla ludzi: jeśli twój komponent nie aktualizuje się prawidłowo, zbadaj
shouldComponentUpdate
, usuwając funkcję connect i zobacz, czy rozwiązuje problem. Jeśli tak, pobierz,routerReducer
a komponent zaktualizuje się poprawnie po zmianie adresu URL.Na zakończenie, po zrobieniu tego wszystkiego, możesz zadzwonić
goBack()
lubpush()
dowolnym momencie!Wypróbuj teraz w jakimś losowym komponencie:
connect()
mapStateToProps
lubmapDispatchToProps
react-router-redux
this.props.dispatch(goBack())
this.props.dispatch(push('/sandwich'))
Jeśli potrzebujesz więcej próbek, sprawdź: https://www.npmjs.com/package/react-router-redux
źródło
Po prostu użyj w ten sposób
źródło
Ten fragment kodu załatwi sprawę za Ciebie.
źródło
React Router v6
useNavigate
Hook to zalecany sposób powrotu teraz:Próbka Codesandbox
Wróć / naprzód wiele wpisów na stosie historii: Idź do określonej trasy:useNavigate
zastępuje,useHistory
aby lepiej obsługiwać nadchodzący tryb React Suspense / Concurrent.źródło
Attempted import error: 'useNavigate' is not exported from 'react-router-dom'.
v6.0.0-beta.0
programowi deweloperzy uczynilihistory
pakiet zależnością równorzędną. Spójrz na zaktualizowaną skrzynkę Codesandbox, która znów działa.Według https://reacttraining.com/react-router/web/api/history
dla
"react-router-dom": "^5.1.2",
,źródło