Khi chúng ta tạo ra một ứng dụng React thì mặc định sẽ không bao gồm định tuyến đến các trang.
React Router là giải pháp phổ biến nhất để định tuyến đến các trang.
Thêm React Router
Để thêm React Router vào ứng dụng của mình, chúng ta hãy chạy dòng lệnh sau trong terminal từ thư mục gốc của ứng dụng:
Lưu ý: Tutorial này sử dụng React Router v6. Nếu như bạn nâng cấp từ v5, thì bạn sẽ cần phải sử dụng lá cờ @latest:
Cấu trúc thư mục
Để tạo ra một ứng dụng với định tuyến đến nhiều trang, trước tiên chúng ta hãy bắt đầu bằng cấu trúc tập tin.Ở bên trong thư mục src, chúng ta sẽ tạo ra một thư mục có tên là pages với một số tập tin:
Mỗi tập tin sẽ chứa một React component vô cùng cơ bản.Cách sử dụng cơ bản
Bây giờ chúng ta sẽ sử dụng Router của mình trong tập tin index.js.
Ví dụ sau sẽ sử dụng React Router để định tuyến đến các trang dựa vào URL:
index.js:
Giải thích ví dụ
Trước tiên chúng ta bao bọc nội dung của mình bằng <BrowserRouter>.
Sau đó chúng ta sẽ định nghĩa <Routes> của mình. Một ứng dụng có thể có nhiều <Routes>. Ví dụ cơ bản của chúng ta chỉ sử dụng một <Routes>.
Các <Route> có thể được lồng nhau. <Route> đầu tiên có đường dẫn là / và render ra Layout component.
Các <Route> được lồng nhau kế thừa và thêm vào route cha. Vì vậy đường dẫn đến blogs được kết hợp với route cha và trở thành /blogs.
Định tuyến đến Home component không có đường dẫn nhưng có thuộc tính index. Thuộc tính index này chỉ định rằng route này là route mặc định cho route cha, đó là /.
Việc thiết lập đường dẫn thành * sẽ đóng vai trò chung cho mọi URL không xác định. Điều này rất tốt cho một trang thông báo lỗi 404.
Các trang / Component
Layout component có các phần tử <Outlet> và <Link>.
Phần tử <Outlet> sẽ render ra route hiện tại được chọn.
Phần tử <Link> được sử dụng để thiết lập URL và theo dõi lịch sử duyệt web.
Bất cứ khi nào chúng ta liên kết đến một đường dẫn nội bộ, chúng ta sẽ sử dụng phần tử <Link> thay cho <a href="">.
Layout route là một component để chèn nội dung chung trên tất cả các trang, chẳng hạn như một menu điều hướng.
Layout.js:
Home.js:
Blogs.js:
Contact.js:
NoPage.js: