Rozważ następujące:
var AppRoutes = [
<Route handler={App} someProp="defaultProp">
<Route path="/" handler={Page} />
</Route>,
<Route handler={App} someProp="defaultProp">
<Route path="/" handler={Header} >
<Route path="/withheader" handler={Page} />
</Route>
</Route>,
<Route handler={App} someProp="defaultProp">
<Route path=":area" handler={Area} />
<Route path=":area/:city" handler={Area} />
<Route path=":area/:city/:locale" handler={Area} />
<Route path=":area/:city/:locale/:type" handler={Area} />
</Route>
];
Mam szablon aplikacji, szablon HeaderTemplate i sparametryzowany zestaw tras z tym samym programem obsługi (w szablonie aplikacji). Chcę mieć możliwość obsługi tras 404, gdy czegoś nie znaleziono. Na przykład / CA / SanFrancisco powinno być znalezione i obsługiwane przez Area, a / SanFranciscoz - 404.
Oto jak szybko testuję trasy.
['', '/', '/withheader', '/SanFranciscoz', '/ca', '/CA', '/CA/SanFrancisco', '/CA/SanFrancisco/LowerHaight', '/CA/SanFrancisco/LowerHaight/condo'].forEach(function(path){
Router.run(AppRoutes, path, function(Handler, state){
var output = React.renderToString(<Handler/>);
console.log(output, '\n');
});
});
Problem polega na tym, że / SanFranciscoz jest zawsze obsługiwany przez stronę Area, ale chcę, aby 404. Ponadto, jeśli dodam NotFoundRoute do pierwszej konfiguracji trasy, wszystkie strony obszaru 404.
<Route handler={App} someProp="defaultProp">
<Route path="/" handler={Page} />
<NotFoundRoute handler={NotFound} />
</Route>,
Co ja robię źle?
Oto sedno, które można pobrać i poeksperymentować.
react-router
4m1r
źródło
źródło
Odpowiedzi:
DefaultRoute i NotFoundRoute zostały usunięte wreak-router 1.0.0.
Chciałbym podkreślić, że domyślna trasa oznaczona gwiazdką musi być ostatnia na obecnym poziomie hierarchii, aby działała. W przeciwnym razie nadpisuje wszystkie inne trasy, które pojawiają się po niej w drzewie, ponieważ jest pierwsza i pasuje do każdej ścieżki.
Dla routerów React-Router 1, 2 i 3
Jeśli chcesz wyświetlić 404 i zachować ścieżkę ( taka sama funkcjonalność jak NotFoundRoute)
Jeśli chcesz wyświetlić stronę 404, ale zmienić adres URL ( taka sama funkcjonalność jak DefaultRoute)
Przykład z wieloma poziomami:
Do routerów React-Router 4 i 5
Trzymaj się ścieżki
Przekieruj na inną trasę (zmień adres URL)
Porządek ma znaczenie!
źródło
<Redirect from='*' to='/home' />
w tej składni:const routes = { component: Main, childRoutes: [ { path: '/', component: Home }, ], indexRoute: { component: Main, }, };
<Route render={(props)=> <MyComponent myProp={someVar} {...props} />} />
W nowszych wersjach react-router chcesz zawijać trasy w Switch, który renderuje tylko pierwszy dopasowany komponent. W przeciwnym razie wyrenderowanych byłoby wiele komponentów.
Na przykład:
źródło
path="*"
na trasie NotFound. Pominięciepath
spowoduje, że trasa będzie zawsze pasować.path
całkowicie nieznaną trasęW nowej wersji React Router (używającej teraz wersji 2.0.1) możesz użyć gwiazdki jako ścieżki do trasowania wszystkich „innych ścieżek”.
Więc wyglądałoby to tak:
źródło
Ta odpowiedź dotyczy react-router-4. Możesz zawijać wszystkie trasy w bloku Switch, który działa tak samo jak wyrażenie przełącznika wielkości liter i renderuje składnik z pierwszą dopasowaną trasą. na przykład)
Kiedy użyć
exact
Bez dokładnego:
Z dokładnym:
Teraz, jeśli akceptujesz parametry routingu i jeśli okaże się to nieprawidłowe, możesz sobie z tym poradzić w samym komponencie docelowym. na przykład)
Teraz w ProfilePage.js
Aby uzyskać więcej informacji, możesz przejść przez ten kod:
App.js
ProfilePage.js
źródło
Zgodnie z dokumentacją trasa została znaleziona, chociaż zasobu nie było.
Więc zawsze możesz dodać linię w
Router.run()
przed,React.render()
aby sprawdzić, czy zasób jest prawidłowy. Po prostu prześlij rekwizyt do komponentu lub nadpiszHandler
komponent niestandardowym, aby wyświetlić widok NotFound.źródło
<Route path="*" to="/dest" />
lub<Redirect from="*" to="/dest" />
jako ostatniej pasującej trasy podrzędnej, jak sądzęWłaśnie rzuciłem okiem na twój przykład, ale jeśli dobrze go zrozumiałem, próbujesz dodać trasy 404 do dynamicznych segmentów. Kilka dni temu miałem ten sam problem, znalazłem # 458 i # 1103 i skończyło się na ręcznym sprawdzeniu w funkcji renderowania:
mam nadzieję, że to pomoże!
źródło