⊗jsrtPmRtNS 43 of 47 menu

Trạng thái điều hướng trong React Router

Nếu chúng ta nhấp vào các sản phẩm trong danh sách, chúng ta thấy rằng lần đầu tiên trang sản phẩm được tải với độ trễ, còn những lần sau thì đã nhanh, điều tương tự cũng xảy ra khi thêm và cập nhật sản phẩm, vì chúng ta có bộ nhớ cache ở phía máy khách.

Trong bài học này, chúng ta sẽ hiển thị cho người dùng trang của chúng ta đang ở trạng thái nào. Điều này có thể được hỗ trợ bởi hook useNavigation. Kết quả làm việc của hook này trả về một đối tượng với một số thuộc tính. Chúng ta sẽ quan tâm đến một trong số chúng - thuộc tính state.

Thuộc tính state có thể có 3 giá trị: 'idle' (không có gì xảy ra), 'submitting' (khi gửi biểu mẫu thông qua POST, PUT, PATCH hoặc DELETE và action của route được gọi), 'loading' (khi trình tải cho route tiếp theo được gọi để hiển thị trang tiếp theo). Chúng ta sẽ quan tâm đến giá trị cuối cùng.

Hãy vào tệp root.jsx và nhập hook này:

import { useNavigation } from 'react-router-dom';

Sau đó, đối với kết quả mà hook trả về, hãy tạo một biến navigation trong hàm Root - trước return:

const { products } = useLoaderData(); const navigation = useNavigation();

Và bây giờ hãy sử dụng thuộc tính state của nó, nếu giá trị là 'loading', thì chúng ta sẽ đặt lớp loading cho div, nơi chúng ta hiển thị dữ liệu sản phẩm:

<div id="product" className={navigation.state === 'loading' ? 'loading' : ''}> <Outlet /> </div>

Chúng ta cần thêm kiểu cho lớp loading vào index.css. Hãy trong trường hợp trạng thái tải chỉ tăng opacity:

div.loading { opacity: 0.3; }

Bây giờ, nếu, sau khi tải lại trang web, nhấp vào các sản phẩm trong danh sách hoặc, ví dụ, thêm một sản phẩm mới, chúng ta sẽ thấy rằng trang hiện tại trong một khoảnh khắc sẽ mờ đi, trước khi trang tiếp theo xuất hiện.

Lấy ứng dụng mà bạn đã tạo trong các bài tập của các bài học trước. Sử dụng tài liệu của bài học, với sự trợ giúp của hook useNavigation hãy làm sao để người dùng có thể thấy rằng trang tiếp theo với dữ liệu sinh viên đang được tải.

Tiếng Việt
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbek
Chúng tôi sử dụng cookie để vận hành trang web, phân tích và cá nhân hóa. Việc xử lý dữ liệu được thực hiện tuân theo Chính sách bảo mật.
chấp nhận tất cả tùy chỉnh từ chối