Tarayıcı ortamlarını hedefliyorsanız react-router-dom
, yerine paket kullanmanız gerekir react-router
. Çekirdek, ( react
) ve platforma özgü kodu ( react-dom
, react-native
) iki ayrı paket kurmanıza gerek olmayan ince farkla ayırmak için React ile aynı yaklaşımı izliyorlar , böylece ortam paketleri her şeyi içeriyor ihtiyacınız var. Projenize şu şekilde ekleyebilirsiniz:
yarn add react-router-dom
veya
npm i react-router-dom
Yapmanız gereken ilk şey <BrowserRouter>
, uygulamanızdaki en üst ana bileşen olarak a sağlamaktır . <BrowserRouter>
HTML5 history
API'sını kullanır ve sizin için yönetir, böylece onu kendiniz örnekleme ve <BrowserRouter>
bir prop olarak bileşene aktarma konusunda endişelenmenize gerek yoktur (önceki sürümlerde yapmanız gerektiği gibi).
V4'te, programlı olarak gezinmek için , uygulamanızdaki en üst üst öğe olarak bir sağlayıcı bileşeniniz olduğu sürece history
React aracılığıyla kullanılabilen nesneye erişmeniz gerekir . Kütüphane , bir özellik olarak içerdiği nesneyi bağlam yoluyla ortaya koyar . Arayüz gibi çeşitli navigasyon yöntemleri sunmaktadır , ve diğerleri arasında,. Sen özellikleri ve yöntemlerin tüm listesini kontrol edebilirsiniz burada .context
<BrowserRouter>
router
history
history
push
replace
goBack
Redux / Mobx kullanıcıları için Önemli Not
Uygulamanızda durum yönetimi kitaplığınız olarak redux veya mobx kullanıyorsanız, konum farkında olması gereken, ancak bir URL güncellemesini tetikledikten sonra yeniden oluşturulmayan bileşenlerle ilgili sorunlarla karşılaşmış olabilirsiniz
Bu oluyor çünkü bağlam modelini kullanan bileşenlere react-router
geçiyor location
.
Connect ve gözlemci, shouldComponentUpdate yöntemleri mevcut sahne ve sonraki sahne özellikleri arasında sığ bir karşılaştırma yapan bileşenler oluşturur. Bu bileşenler yalnızca en az bir pervane değiştiğinde yeniden oluşturulur. Bu, konum değiştiğinde güncelleme yapmalarını sağlamak için, konum değiştiğinde değişen bir destek vermeleri gerektiği anlamına gelir.
Bunu çözmek için 2 yaklaşım:
- Bağlı bileşeninizi yolsuz bir şekilde sarın
<Route />
. Geçerli location
nesne, <Route>
oluşturduğu bileşene bir geçişin sağladığı desteklerden biridir
- Bağlı bileşeninizi
withRouter
, aslında location
bir pervane ile aynı etkiye sahip ve enjekte eden yüksek dereceli bileşenle sarın
Bunu bir kenara bırakarak, tavsiyeyle sipariş edilen programlı olarak gezinmenin dört yolu vardır:
1. Bir <Route>
Bileşenin Kullanılması
Bildirici bir tarzı teşvik eder. Sürüm 4'ten önce,
<Route />
bileşenler rota yapınızı önceden düşünmek zorunda olan bileşen hiyerarşinizin en üstüne yerleştirildi. Bununla birlikte, artık URL'nize bağlı olarak koşullu oluşturma için daha iyi bir kontrole sahip olmanızı sağlayan, ağacınızın
herhangi bir yerinde<Route>
bileşenlere sahip olabilirsiniz . enjekte eder , ve bileşeniniz sahne olarak. Navigasyon yöntemleri (örneğin , , ...) özellikleri olarak mevcuttur nesne.
Route
match
location
history
push
replace
goBack
history
Bir ile bir şeyler işlemek için 3 yol vardır Route
ya kullanılarak, component
, render
veya children
sahne, ama aynı onlardan birden fazla kullanmayın Route
. Seçim, kullanım durumuna bağlıdır, ancak temel olarak ilk iki seçenek yalnızca path
url konumuyla eşleşirse children
bileşeninizi oluşturur ; oysa bileşenle birlikte yolun konumla eşleşip eşleşmediği görüntülenir (URL'ye göre kullanıcı arayüzünü ayarlamak için yararlıdır) eşleştirme).
Eğer bileşen render çıktı özelleştirmek istiyorsanız , bir fonksiyonun içinde bileşeni sarmak gerekiyor ve kullanmak render
sizin bileşene sen dışında, arzu başka sahne geçmek için, seçeneğini match
, location
ve history
. Açıklamak için bir örnek:
import { BrowserRouter as Router } from 'react-router-dom'
const ButtonToNavigate = ({ title, history }) => (
<button
type="button"
onClick={() => history.push('/my-new-location')}
>
{title}
</button>
);
const SomeComponent = () => (
<Route path="/" render={(props) => <ButtonToNavigate {...props} title="Navigate elsewhere" />} />
)
const App = () => (
<Router>
<SomeComponent /> // Notice how in v4 we can have any other component interleaved
<AnotherComponent />
</Router>
);
2.- withRouter
HoC Kullanımı
Bu yüksek dereceli bileşen, aynı sahne donanımını enjekte edecektir Route
. Bununla birlikte, dosya başına yalnızca 1 HoC'ye sahip olabileceğiniz sınırlama boyunca devam eder.
import { withRouter } from 'react-router-dom'
const ButtonToNavigate = ({ history }) => (
<button
type="button"
onClick={() => history.push('/my-new-location')}
>
Navigate
</button>
);
ButtonToNavigate.propTypes = {
history: React.PropTypes.shape({
push: React.PropTypes.func.isRequired,
}),
};
export default withRouter(ButtonToNavigate);
3. - Bir Redirect
bileşen kullanmak
Bir oluşturma
<Redirect>
yeni bir konuma gider. Ancak,
varsayılan olarak , geçerli konumun, sunucu tarafı yönlendirmeleri (HTTP 3xx) gibi yenisiyle değiştirildiğini unutmayın. Yeni konum,
to
bir dize (yönlendirilecek URL) veya bir
location
nesne olabilecek prop tarafından sağlanır . Bunun yerine
geçmişe yeni bir giriş eklemek istiyorsanız , bir
push
pervane de geçirin ve
true
<Redirect to="/your-new-location" push />
4.- router
Bağlam aracılığıyla manuel erişim
Biraz cesaret kırıldı çünkü
bağlam hala deneysel bir API ve gelecekteki React sürümlerinde kırılması / değişmesi muhtemel
const ButtonToNavigate = (props, context) => (
<button
type="button"
onClick={() => context.router.history.push('/my-new-location')}
>
Navigate to a new location
</button>
);
ButtonToNavigate.contextTypes = {
router: React.PropTypes.shape({
history: React.PropTypes.object.isRequired,
}),
};
Söylemeye gerek yok, tarayıcı dışı ekosistemler için olması gereken, örneğin bellekte<NativeRouter>
bir gezinme yığınını çoğaltan ve paket yoluyla kullanılabilen React Native platformunu hedefleyen başka Yönlendirici bileşenleri de var .react-router-native
Daha fazla referans için resmi belgelere göz atmakta tereddüt etmeyin . Ayrıca, reaksiyon yönlendiricisinin v4'e oldukça güzel bir giriş sağlayan ve bazı önemli değişiklikleri vurgulayan kütüphanenin ortak yazarlarından biri tarafından yapılan bir video da var .