No results found
We couldn't find anything using that term, please try searching for something else.
< /canvas>< /span>< /p> React router dom V6 xuất hiện sử dụng các tính năng tốt nhất từ các phiên bản trước đã kết thúc một thập kỉ định tuyến phía c
React router dom V6 xuất hiện sử dụng các tính năng tốt nhất từ các phiên bản trước đã kết thúc một thập kỉ định tuyến phía client,nó tương thích với react từ 16.8 trở lên. Bài viết này mình sẽ tổng hợp những kiến thức cơ bản đến nâng cao về react-router-dom< /code>,các ví dụ được viết vàchỉnh sửa trên codesandbox để dễ theo dõi ,yêu cầu cần có kiến thức cơ bản về
html< /code>
css< /code>
javascript< /code>
reactj< /code> vàmột chút thời gian.< /p>
# Tạo ứng dụng reactj
npx create-react-app react-router-tutorial
# Cài thư viện
cd react-router-tutorial
npm install react-router-dom@6
< /code>< /pre>
Thêm bootstrap V5 vào file public / index.html< /code> để xây dựng giao diện cho nhanh< /p>
<< /span>link< /span>
rel< /span>=< /span>"< /span>stylesheet"< /span>< /span>
href< /span>=< /span>"< /span>https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"< /span>< /span>
/>< /span>< /span>
< /code>< /pre>
2. Giao diện vàcấu trúc component< /h2>
- cấu trúc phân chia component< /li>
< /ul>
- App
|-- sidebar
|-- Dashboard
< /code>< /pre>
import< /span> sidebar from< /span> './components/sidebar'< /span>
import< /span> Dashboardfrom< /span> ' ./components / Dashboard'< /span>
export< /span> default< /span> function< /span> App< /span>(< /span>)< /span> {< /span>
return< /span> (< /span>
<< /span>< /span>>< /span>< /span>
< /span><< /span>sidebar< /span>< /span> />< /span>< /span>
< /span><< /span>Dashboard< /span>< /span> />< /span>< /span>
< /span></< /span>< /span>>< /span>< /span>
)< /span>
}< /span>
< /code>< /pre>
3 . configure route< /h2>
Đầu tiên muốn kết nối ứng dụng của bạn với URL của trình duyệt thì phải import Browserroutervà bọc nó bên ngoài toàn bộ ứng dụng chính là componentApp< /code>< /p>
import< /span> ReactDOMfrom< /span> 'react-dom'< /span>
import< /span> App from< /span> './App'< /span>
import< /span> {< /span> Browserrouter}< /span> from< /span> ' react - router - dom '< /span>
const< /span> rootelement=< /span> document.< /span>getElementById< /span>(< /span>'root'< /span>)< /span>
ReactDOM.< /span>render< /span>(< /span>
<< /span>Browserrouter< /span>< /span>>< /span>< /span>
< /span><< /span>App< /span>< /span> />< /span>< /span>
< /span></< /span>Browserrouter< /span>< /span>>< /span>< /span>,< /span>
rootelement
)< /span>
< /code>< /pre>
tạicomponent sidebar< /code> ở giao diện ban đầu chúng ta mới chỉ sử dụng thẻ a< /code>,giờ để điều hướng ta sử dụng link< /p>
import< /span> {< /span> link}< /span> from< /span> ' react - router - dom '< /span>
export< /span> const< /span> sidebar< /span> =< /span> (< /span>)< /span> =>< /span> {< /span>
return< /span> (< /span>
<< /span>ul< /span>>< /span>< /span>
< /span><< /span>li< /span>>< /span>< /span>
< /span>{< /span>}< /span>
< /span><< /span>link< /span>< /span> to< /span>=< /span>'< /span>/'< /span>< /span> className< /span>=< /span>'< /span>nav - link'< /span>< /span>>< /span>< /span>Dashboard< /span></< /span>link< /span>< /span>>< /span>< /span>
< /span></< /span>li< /span>>< /span>< /span>
< /span><< /span>li< /span>>< /span>< /span>
< /span>{< /span>}< /span>
< /span><< /span>link< /span>< /span> to< /span>=< /span>'< /span>/orders'< /span>< /span> className< /span>=< /span>'< /span>nav - link'< /span>< /span>>< /span>< /span>order< /span></< /span>link< /span>< /span>>< /span>< /span>
< /span></< /span>li< /span>>< /span>< /span>
< /span><< /span>li< /span>>< /span>< /span>
< /span>{< /span>}< /span>
< /span><< /span>link< /span>< /span> to< /span>=< /span>'< /span>/products'< /span>< /span> className< /span>=< /span>'< /span>nav - link'< /span>< /span>>< /span>< /span>product< /span></< /span>link< /span>< /span>>< /span>< /span>
< /span></< /span>li< /span>>< /span>< /span>
< /span><< /span>li< /span>>< /span>< /span>
< /span>{< /span>}< /span>
< /span><< /span>link< /span>< /span> to< /span>=< /span>'< /span>/customers'< /span>< /span> className< /span>=< /span>'< /span>nav - link'< /span>< /span>>< /span>< /span>customer< /span></< /span>link< /span>< /span>>< /span>< /span>
< /span></< /span>li< /span>>< /span>< /span>
< /span></< /span>ul< /span>>< /span>< /span>
)< /span>
}< /span>
< /code>< /pre>
Như vậy tại sidebar< /code> chúng ta đã điều hướng is sang sing các URL khác nhau ,giờ với các URL đó sẽ load các component tương ứng sử dụng route vàroute ,tại componentApp< /code> sửa lại< /p>
import< /span> {< /span> route,< /span> route }< /span> from< /span> ' react - router - dom '< /span>
export< /span> default< /span> function< /span> App< /span>(< /span>)< /span> {< /span>
return< /span> (< /span>
<< /span>route< /span>< /span>>< /span>< /span>
< /span><< /span>route< /span>< /span> path< /span>=< /span>'< /span>/'< /span>< /span> element< /span>=< /span>{< /span><< /span>Dashboard< /span>< /span> />< /span>< /span>}< /span>< /span> />< /span>< /span>
< /span><< /span>route< /span>< /span> path< /span>=< /span>'< /span>/orders'< /span>< /span> element< /span>=< /span>{< /span><< /span>order< /span>< /span> />< /span>< /span>}< /span>< /span> />< /span>< /span>
< /span><< /span>route< /span>< /span> path< /span>=< /span>'< /span>/products'< /span>< /span> element< /span>=< /span>{< /span><< /span>product< /span>< /span> />< /span>< /span>}< /span>< /span> />< /span>< /span>
< /span><< /span>route< /span>< /span> path< /span>=< /span>'< /span>/customers'< /span>< /span> element< /span>=< /span>{< /span><< /span>customer< /span>< /span> />< /span>< /span>}< /span>< /span> />< /span>< /span>
< /span></< /span>route< /span>< /span>>< /span>< /span>
)< /span>
}< /span>
< /code>< /pre>
Code demo: https://codesandbox.io/p/devbox/configuring-route-c87nm?file=%2Fsrc%2FApp.jsx< /p>
4. Active link< /h2>
Ở phần trước tại component sidebar< /code> khi chúng ta sử dụng <link>< /code> thì is này output thực tế ra HTML như này< /p>
<< /span>link< /span>< /span> className< /span>=< /span>'< /span>nav - link'< /span>< /span> to< /span>=< /span>'< /span>/orders'< /span>< /span>>< /span>< /span>order< /span></< /span>link< /span>< /span>>< /span>< /span>
<< /span>a< /span> class< /span>=< /span>"< /span>nav - link"< /span>< /span> href< /span>=< /span>"< /span>/orders"< /span>< /span>>< /span>< /span>order< /span></< /span>a< /span>>< /span>< /span>
< /code>< /pre>
Vẫn khá là ok nhưng giờ chúng ta muốn có thêm classactive< /code> hoặc style gì đó đặc biệt cho link đang xem thì sẽ không dùng cách này được.< /p>
4-1. Active link với tên class là active< /h3>
Nếu class tên là active< /code> thì easy rồi chúng ta chỉ việc thay link< /code> thành Navlink< /code>,các bạn sẽ thấy việc output ra html cũng đã khác nhau rồi.< /p>
<< /span>Navlink< /span>< /span> className< /span>=< /span>'< /span>nav - link'< /span>< /span> to< /span>=< /span>'< /span>/orders'< /span>< /span>>< /span>< /span>order< /span></< /span>Navlink< /span>< /span>>< /span>< /span>
<< /span>a< /span> aria-current< /span>=< /span>"< /span>page"< /span>< /span> class< /span>=< /span>"< /span>nav - link active"< /span>< /span> href< /span>=< /span>"< /span>/orders"< /span>< /span>>< /span>< /span>order< /span></< /span>a< /span>>< /span>< /span>
< /code>< /pre>
Code demo: https://codesandbox.io/p/devbox/hardcore-babycat-ubh4h?file=%2Fsrc%2Fcomponents%2Fsidebar.jsx< /p>
4 - 2 . active link với tên class is khác khác< /h3>
nếu chúng ta muốn tên class khi được active khác đi nhưactivate< /code> hay current- page< /code> thì viết kiểu function như này< /p>
import< /span> {< /span> Navlink }< /span> from< /span> ' react - router - dom '< /span>
const< /span> sidebar< /span> =< /span> (< /span>)< /span> =>< /span> {< /span>
const< /span> navlinkClass< /span> =< /span> (< /span>{< /span> isActive}< /span>< /span>)< /span> =>< /span> {< /span>
return< /span> isActive?< /span> 'nav - link activate'< /span> :< /span> 'nav - link'< /span>
}< /span>
return< /span> (< /span>
<< /span>ul< /span>>< /span>< /span>
< /span><< /span>li< /span>>< /span>< /span>
< /span><< /span>Navlink< /span>< /span> to< /span>=< /span>'< /span>/'< /span>< /span> className< /span>=< /span>{< /span>navlinkClass}< /span>< /span>>< /span>< /span>Dashboard< /span></< /span>Navlink< /span>< /span>>< /span>< /span>
< /span></< /span>li< /span>>< /span>< /span>
< /span></< /span>ul< /span>>< /span>< /span>
)< /span>
}< /span>
< /code>< /pre>
Code demo: https://codesandbox.io/p/devbox/active-link-class-activate-crjtu?file=%2Fsrc%2Fcomponents%2Fsidebar.jsx< /p>
4-3. Active link với style< /h3>
Nếu không muốn trạng thái active viết theo kiểu class mà viết kiểu style thì làm như này< /p>
import< /span> {< /span> Navlink }< /span> from< /span> ' react - router - dom '< /span>
const< /span> sidebar< /span> =< /span> (< /span>)< /span> =>< /span> {< /span>
const< /span> navlinkStyle< /span> =< /span> (< /span>{< /span> isActive}< /span>< /span>)< /span> =>< /span> (< /span>{< /span>
color:< /span> isActive?< /span> '#fff'< /span> :< /span> ''< /span>,< /span>
backgroundColor:< /span> isActive?< /span> '#0d6efd'< /span> :< /span> ''< /span>
}< /span>)< /span>
return< /span> (< /span>
<< /span>ul< /span>>< /span>< /span>
< /span><< /span>li< /span>>< /span>< /span>
< /span><< /span>Navlink< /span>< /span> to< /span>=< /span>'< /span>/'< /span>< /span> className< /span>=< /span>'< /span>nav - link'< /span>< /span> style< /span>=< /span>{< /span>navlinkStyle}< /span>< /span>>< /span>< /span>
Dashboard
< /span></< /span>Navlink< /span>< /span>>< /span>< /span>
< /span></< /span>li< /span>>< /span>< /span>
< /span></< /span>ul< /span>>< /span>< /span>
)< /span>
}< /span>
< /code>< /pre>
Code demo: https://codesandbox.io/p/devbox/active-link-style-xbyei?file=%2Fsrc%2Fcomponents%2Fsidebar.jsx< /p>
4-4. Custom active link< /h3>
Nhiều khi đời không như mơ,vì vài lí do nào đó mà chúng ta không thể đặt class active hay style active vào chính thẻ a mà phải đặt ở thẻ cha của nó như thẻ li chẳng hạn< /p>
<< /span>li>< /span>
<< /span>a href=< /span>" / "< /span> class< /span>=< /span>"active"< /span>>< /span>Dashboard<< /span>/< /span>a>< /span>
<< /span>/< /span>li>< /span>
<< /span>li class< /span>=< /span>"active"< /span>>< /span>
<< /span>a href=< /span>" / "< /span>>< /span>Dashboard<< /span>/< /span>a>< /span>
<< /span>/< /span>li>< /span>
< /code>< /pre>
Ví dụ sau trình bày cách tạo một Custom Active link sử dụng usematch< /code> vàuseresolvedpath< /code> trong is react react router< /p>
import< /span> {< /span> link,< /span> usematch,< /span> useresolvedpath }< /span> from< /span> ' react - router - dom '< /span>
const< /span> sidebar< /span> =< /span> (< /span>)< /span> =>< /span> {< /span>
const< /span> Customlink< /span> =< /span> (< /span>{< /span> child,< /span> to,< /span> ...< /span>prop}< /span>< /span>)< /span> =>< /span> {< /span>
const< /span> resolved =< /span> useresolvedpath< /span>(< /span>to)< /span>
const< /span> match =< /span> usematch< /span>(< /span>{< /span> path:< /span> resolved.< /span>pathname,< /span> end:< /span> true< /span> }< /span>)< /span>
return< /span> (< /span>
<< /span>li< /span> className< /span>=< /span>{< /span>match ?< /span> 'active'< /span> :< /span> ''< /span>}< /span>< /span>>< /span>< /span>
< /span><< /span>link< /span>< /span> to< /span>=< /span>{< /span>to}< /span>< /span> {< /span>...< /span>props}< /span>< /span>>< /span>< /span>
< /span>{< /span>children}< /span>
< /span></< /span>link< /span>< /span>>< /span>< /span>
< /span></< /span>li< /span>>< /span>< /span>
)< /span>
}< /span>
return< /span> (< /span>
<< /span>ul< /span>>< /span>< /span>
< /span><< /span>Customlink< /span>< /span> to< /span>=< /span>'< /span>/'< /span>< /span>>< /span>< /span>Dashboard< /span></< /span>Customlink< /span>< /span>>< /span>< /span>
< /span><< /span>Customlink< /span>< /span> to< /span>=< /span>'< /span>/orders'< /span>< /span>>< /span>< /span>order< /span></< /span>Customlink< /span>< /span>>< /span>< /span>
< /span><< /span>Customlink< /span>< /span> to< /span>=< /span>'< /span>/products'< /span>< /span>>< /span>< /span>product< /span></< /span>Customlink< /span>< /span>>< /span>< /span>
< /span><< /span>Customlink< /span>< /span> to< /span>=< /span>'< /span>/customers'< /span>< /span>>< /span>< /span>customer< /span></< /span>Customlink< /span>< /span>>< /span>< /span>
< /span></< /span>ul< /span>>< /span>< /span>
)< /span>
}< /span>
< /code>< /pre>
Code demo: https://codesandbox.io/p/devbox/proud-sound-83m1q?file=%2Fsrc%2Fcomponents%2Fsidebar.jsx< /p>
5. navigate programmatically< /h2>
Ở các phần ví dụ trên khi người dùng is click click vào các link ởsidebar< /code> thì is động chuyển trang được rồi nhưng nếu chúng ta muốn chuyển trang tự động thì sao ? Ví dụ chúng ta có một form is họ đăng nhập khi login thành công thì điều hướng họ đến một trang chủ chẳng hạn ,để làm được yêu cầu này chúng ta sử dụng đến hookusenavigate< /code>< /p>
5-1. usenavigate với 1 tham số< /h3>
Ví dụ bên dưới khi click vào button thì sẽ chuyển đến trangorders< /code>< /p>
import< /span> {< /span> usenavigate }< /span> from< /span> ' react - router - dom '< /span>
const< /span> Dashboard< /span> =< /span> (< /span>)< /span> =>< /span> {< /span>
const< /span> navigate=< /span> usenavigate< /span>(< /span>)< /span>
const< /span> handlesubmit< /span> =< /span> e< /span> =>< /span> {< /span>
e.< /span>preventdefault< /span>(< /span>)< /span>
navigate< /span>(< /span>'orders'< /span>)< /span>
}< /span>
return< /span> (< /span>
<< /span>button< /span> onClick< /span>=< /span>{< /span>handlesubmit}< /span>< /span>>< /span>< /span>submit< /span></< /span>button< /span>>< /span>< /span>
)< /span>
}< /span>
< /code>< /pre>
code demo : https://codesandbox.io/p/devbox/use-navigate-1-f512r?file=%2Fsrc%2Fcomponents%2FDashboard.jsx< /p>
5-2. usenavigate với history< /h3>
Trường hợp bạn muốn sử dụng go< /code>,goBack< /code>,goforward< /code> trong lịch sử trình duyệt.< /p>
import< /span> {< /span> usenavigate }< /span> from< /span> ' react - router - dom '< /span>
export< /span> default< /span> function< /span> App< /span>(< /span>)< /span> {< /span>
const< /span> navigate=< /span> usenavigate< /span>(< /span>)< /span>
return< /span> (< /span>
<< /span>< /span>>< /span>< /span>
< /span><< /span>button< /span> onClick< /span>=< /span>{< /span>(< /span>)< /span> =>< /span> navigate< /span>(< /span>-< /span>2< /span>)< /span>}< /span>< /span>>< /span>< /span>Go 2 pages back< /span></< /span>button< /span>>< /span>< /span>
< /span><< /span>button< /span> onClick< /span>=< /span>{< /span>(< /span>)< /span> =>< /span> navigate< /span>(< /span>-< /span>1< /span>)< /span>}< /span>< /span>>< /span>< /span>Go back< /span></< /span>button< /span>>< /span>< /span>
< /span><< /span>button< /span> onClick< /span>=< /span>{< /span>(< /span>)< /span> =>< /span> navigate< /span>(< /span>1< /span>)< /span>}< /span>< /span>>< /span>< /span>Go forward< /span></< /span>button< /span>>< /span>< /span>
< /span><< /span>button< /span> onClick< /span>=< /span>{< /span>(< /span>)< /span> =>< /span> navigate< /span>(< /span>2< /span>