Nếu bạn đang nhắm mục tiêu môi trường trình duyệt, bạn cần sử dụng react-router-dom
gói, thay vì react-router
. Họ đang theo cách tiếp cận giống như React đã làm, để tách lõi, ( react
) và mã cụ thể của nền tảng, ( react-dom
, react-native
) với sự khác biệt tinh tế mà bạn không cần phải cài đặt hai gói riêng biệt, vì vậy các gói môi trường chứa mọi thứ bạn cần. Bạn có thể thêm nó vào dự án của bạn như:
yarn add react-router-dom
hoặc là
npm i react-router-dom
Điều đầu tiên bạn cần làm là cung cấp một <BrowserRouter>
thành phần cha mẹ hàng đầu trong ứng dụng của bạn. <BrowserRouter>
sử dụng history
API HTML5 và quản lý nó cho bạn, vì vậy bạn không phải lo lắng về việc tự khởi tạo nó và chuyển nó xuống <BrowserRouter>
thành phần dưới dạng chống đỡ (như bạn cần làm trong các phiên bản trước).
Trong V4, để điều hướng theo chương trình, bạn cần truy cập vào history
đối tượng, có sẵn thông qua React context
, miễn là bạn có một thành phần <BrowserRouter>
nhà cung cấp là phụ huynh hàng đầu trong ứng dụng của bạn. Thư viện phơi bày thông qua bối cảnh router
đối tượng, mà chính nó chứa history
như một tài sản. Các history
giao diện cung cấp một số phương pháp định vị, chẳng hạn như push
, replace
vàgoBack
, trong số những người khác. Bạn có thể kiểm tra toàn bộ danh sách các thuộc tính và phương thức ở đây .
Lưu ý quan trọng đối với người dùng Redux / Mobx
Nếu bạn đang sử dụng redux hoặc mobx làm thư viện quản lý trạng thái trong ứng dụng của mình, bạn có thể gặp phải các vấn đề với các thành phần cần nhận biết vị trí nhưng không được hiển thị lại sau khi kích hoạt cập nhật URL
Điều đó xảy ra bởi vì react-router
chuyển location
đến các thành phần sử dụng mô hình bối cảnh.
Cả kết nối và người quan sát đều tạo ra các thành phần mà các phương thức ShouldComponentUpdate thực hiện so sánh nông cạn về các đạo cụ hiện tại và các đạo cụ tiếp theo của chúng. Những thành phần đó sẽ chỉ kết xuất lại khi có ít nhất một chỗ dựa đã thay đổi. Điều này có nghĩa là để đảm bảo họ cập nhật khi vị trí thay đổi, họ sẽ cần được cung cấp một chỗ dựa thay đổi khi vị trí thay đổi.
Hai cách tiếp cận để giải quyết điều này là:
- Bọc thành phần được kết nối của bạn một cách vô lối
<Route />
. location
Đối tượng hiện tại là một trong những đạo cụ <Route>
truyền cho thành phần mà nó hiển thị
- Bọc thành phần được kết nối của bạn với
withRouter
bậc cao hơn, trên thực tế có tác dụng tương tự và tiêm location
như một chỗ dựa
Đặt điều đó sang một bên, có bốn cách để điều hướng theo chương trình, được sắp xếp theo khuyến nghị:
1.- Sử dụng một <Route>
thành phần
Nó thúc đẩy một phong cách khai báo. Trước v4,
<Route />
các thành phần được đặt ở đầu phân cấp thành phần của bạn, trước tiên phải nghĩ đến cấu trúc tuyến đường của bạn. Tuy nhiên, bây giờ bạn có thể có
<Route>
các thành phần ở
bất kỳ đâu trong cây của mình, cho phép bạn có quyền kiểm soát tốt hơn để hiển thị có điều kiện tùy thuộc vào URL.
Route
tiêm
match
,
location
và
history
như là đạo cụ vào thành phần của bạn. Các phương pháp định vị (ví dụ như
push
,
replace
,
goBack
...) có sẵn như là thuộc tính của
history
đối tượng.
Có 3 cách để làm cho một cái gì đó với một Route
, bằng cách sử dụng một trong hai component
, render
hoặc children
đạo cụ, nhưng không sử dụng nhiều hơn một trong cùng Route
. Lựa chọn tùy thuộc vào trường hợp sử dụng, nhưng về cơ bản, hai tùy chọn đầu tiên sẽ chỉ hiển thị thành phần của bạn nếu path
khớp với vị trí url, trong khi đó với children
thành phần sẽ được hiển thị xem đường dẫn có khớp với vị trí đó hay không (hữu ích cho việc điều chỉnh UI dựa trên URL phù hợp).
Nếu bạn muốn tùy chỉnh đầu ra vẽ thành phần của bạn , bạn cần phải quấn thành phần của bạn trong một chức năng và sử dụng các render
tùy chọn, để vượt qua thành phần của bạn bất kỳ đạo cụ khác mà bạn mong muốn, ngoài match
, location
và history
. Một ví dụ để minh họa:
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.- Sử dụng withRouter
HoC
Thành phần bậc cao này sẽ tiêm các đạo cụ tương tự như Route
. Tuy nhiên, nó mang theo giới hạn rằng bạn chỉ có thể có 1 HoC cho mỗi tệp.
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.- Sử dụng một Redirect
thành phần
Kết xuất
<Redirect>
sẽ điều hướng đến một vị trí mới. Nhưng hãy nhớ rằng,
theo mặc định , vị trí hiện tại được thay thế bằng vị trí mới, như chuyển hướng phía máy chủ (HTTP 3xx). Vị trí mới được cung cấp bởi
to
prop, có thể là một chuỗi (URL để chuyển hướng đến) hoặc một
location
đối tượng. Thay vào đó, nếu bạn muốn
đẩy một mục mới vào lịch sử , hãy chuyển một chỗ dựa
push
và đặt nó thành
true
<Redirect to="/your-new-location" push />
4.- Truy cập router
thủ công thông qua ngữ cảnh
Một chút nản lòng vì
bối cảnh vẫn là một API thử nghiệm và nó có khả năng phá vỡ / thay đổi trong các bản phát hành React trong tương lai
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,
}),
};
Không cần phải nói, cũng có các thành phần Bộ định tuyến khác dành cho các hệ sinh thái không có trình duyệt, chẳng hạn như <NativeRouter>
sao chép ngăn xếp điều hướng trong bộ nhớ và nhắm mục tiêu nền tảng React Native, có sẵn thông qua react-router-native
gói.
Để biết thêm thông tin, đừng ngần ngại xem các tài liệu chính thức . Ngoài ra còn có một video được thực hiện bởi một trong những đồng tác giả của thư viện cung cấp một giới thiệu khá thú vị về bộ định tuyến v4, nêu bật một số thay đổi lớn.