Sử dụng react router hướng dẫn bạn cách tạo ra các đường dẫn đến các chức năng trong ứng dụng react của mình.
Sử dụng React router
Giới thiệu react-router
React-router là thư viện để tạo ra đường dẫn (route) cho các chức năng trong ứng dụng React. Thư viện này giúp tạo các ứng sụng SPA rất hay.
Cài đặt react-router
Trong folder project, chạy lệnh sau:
npm isntall react-router-dom
Tài liệu hướng dẫn sử dụng react-router
Vào địa chỉ này để xem cách sử dụng (nếu muốn) https://reactrouter.com/
Sử dụng react-router
ReacrRouter có nhiều component mà bạn cần import vào để dùng. Ví dụ
import{
BrowserRouter
,Routes
,Route
,NavLink,
Navigate}
from
"react-router-dom";
Routes
Là nơi khai báo các Route trong đó, mỗi Route là một khai báo đường dẫn cho 1 component trong ứng dụng của bạn.
<Routes> ... </Routes>
Route
Mỗi Route là 1 đường dẫn đưa người dùng vào một chức năng nào đó trong ứng dụng, thường là dẫn vào một component. Nghĩa là khi user truy cập theo đường dẫn bạn khai báo thì component tương ứng sẽ được render ra trang web.
<article className="main">
<Routes>
<Route path="/" element={<TrangChu/>} />
<Route path="/gioithieu" element={<GioiThieu/>} />
<Route path="/lienhe" element={<LienHe/>} />
<Route path='/sach/:id' element={<Sach/>} />
<Route element={<NotFound/>}/>
</Routes>
</article>
Trong đó path là đường dẫn trên URL tùy ý bạn đặt, element là component sẽ được render để hiện dữ liệu cho user xem. Trong path có thể dùng diễn tả tham số sau dấu : (trong ví dụ trên là tham số id) . Khi đó trong component có thể dùng useParams() để lấy giá trị tham số vào để dùng, tham khảo ví dụ sau:
//Sach.js import { useParams } from "react-router-dom"; const Sach = () => { let { id } = useParams(); return( ...) }
Trong một route, bạn cũng có thể chạy thực thi 1 function xử lý trước khi trả kết quả cho user:
<Route path="/download" element={ dangNhapChua ? <DownLoad/>: <Navigate to="/"/>}/>
NavLink
Khi đã cài react-router, bạn dùng thẻ <NavLink> để tạo các link cho ứng dụng, lệnh <NavLink sẽ tạo tag <a> cho bạn và khi nhắp vào sẽ không nạp lại toàn trang. Thường dùng <NavLink> để tạo thanh menu. link. Ví dụ
<NavLink to="/">Trang chủ</NavLink>
<NavLink to="/lienhe">Liên hệ </NavLink>
<NavLink to="/giothieu">Giới thiệu </NavLink>
Trong đó giá trị trong to giống như thuộc tính href của tag a, giá trị của to là các đường path bạn đã khai báo trong Routes
Khi chạy ứng dụng, user chọn NavLink nào thì nó được tự động bổ sung class active. Bạn có thể tạo class .active để định dạng cho mục đang được chọn.
BrowserRouter và HashRouter
Là thành phần giúp quy định kiểu địa chỉ. BrowserRouter dùng địa chỉ con kiểu như http://localhost:3000/lienhe còn HashRouter thì dùng địa chỉ con ở sau dấu # như http://localhost:3000/#/lienhe
Demo sử dụng React Router
1. Tạo project mới
2. Chuyển vào folder và cài đặt thư viện react-router-dom
npm isntall react-router-dom
3. Tạo folder components và tạo 3 components trong đó như sau:
– src/TrangChu.js
const TrangChu = () => (
<div> <h1>Đây là thông tin ở trang chủ</h1> </div>
);
export default TrangChu;
– src/Download.js
const Download = () => ( <div> <h1>Đây là trang download soft</h1> </div> ); export default Download;
– src/Sach.js
import { useParams } from "react-router-dom";
const Sach = () => {
let { id } = useParams();
return(
<div> <h1>Đây là trang chi tiết của sách {id} </h1> </div>
)
}
export default Sach;
– src/SachTrongLoai.js
import { useParams } from "react-router-dom";
const SachTrongLoai = () => {
let { id, pagenum = 1 } = useParams();
return(
<div>
<h1>Đây là trang liệt kê sách trong 1 loại {id} {pagenum}</h1>
</div>
)
};
export default SachTrongLoai;
4. Impport vào src/App.js
import TrangChu from './TrangChu';
import SachTrongLoai from './SachTrongLoai';
import Sach from './Sach';
import { BrowserRouter , NavLink, Routes, Route, Navigate } from 'react-router-dom';
5. Code function App
function App() {
let dangNhapChua=false;
return (
<BrowserRouter basename="/">
<div className="container">
<nav>
<NavLink to='/' exact className="hone" >Trang chủ</NavLink>
<NavLink to='/loai/thieunhi'>Thiếu nhi</NavLink>
<NavLink to='/loai/nghethuatsong'>Nghệ thuật sống</NavLink>
</nav>
<main>
<Routes>
<Route path='/' element={<TrangChu/>} />
<Route path='/sach/:id' element={<Sach/>} />
<Route path='/loai/:id/:pagenum?' element={<SachTrongLoai/>} />
<Route path="/download"
element={dangNhapChua? <Download/>:<Navigate to="/"/>} />
</Routes>
</main>
<input/>
</div>
</BrowserRouter>
);
}
export default App;
Định dạng: App.css
.container { width: 1200px; margin: auto;}
.container > nav { height: 45px; background: darkcyan; display: flex; align-items: center; }
.container > nav a { color: white; text-decoration: none; margin-right: 10px;}
.container > main { min-height: 400px; background-color: lightgoldenrodyellow; }
.container nav .active { color: orange; font-weight: bold; font-size: 1.1em;}