React xây giao diện từ các component. Mỗi component là một hàm trả về JSX, nhận dữ liệu qua props.
Bạn sẽ học được
- Viết component hàm với JSX
- Truyền dữ liệu bằng props
- Hiển thị danh sách bằng map và key
- Hiển thị có điều kiện
Thuật ngữ cần biết
- JSX
- Cú pháp giống HTML viết trong JavaScript, được biên dịch thành lời gọi hàm.
- Component
- Hàm có tên viết hoa, trả về giao diện.
- Props
- Dữ liệu truyền từ component cha xuống con, chỉ đọc.
- key
- Mã định danh giúp React phân biệt các phần tử trong danh sách.
Component và JSX
function ChaoMung({ ten }) {
return <h1 className="tieu-de">Xin chào, {ten}!</h1>;
}
export default function App() {
return (
<main>
<ChaoMung ten="Lan" />
<ChaoMung ten="Minh" />
</main>
);
}Khác HTML: dùng className thay class, đóng mọi thẻ, và chỉ trả về một phần tử gốc (hoặc dùng <>...</>).
Danh sách và key
const khoa = [
{ id: 1, ten: "Python", gia: 0 },
{ id: 2, ten: "React", gia: 199000 }
];
function DanhSach() {
return (
<ul>
{khoa.map(k => (
<li key={k.id}>{k.ten} - {k.gia === 0 ? "Miễn phí" : k.gia.toLocaleString("vi-VN") + " đ"}</li>
))}
</ul>
);
}Hiển thị có điều kiện
function TrangThai({ online }) {
return <p>{online ? "Đang trực tuyến" : "Ngoại tuyến"}</p>;
}
// hoặc: {co_loi && <p className="loi">Có lỗi</p>}Tách component
function The({ khoa }) {
return (
<article className="the">
<h3>{khoa.ten}</h3>
<p>{khoa.mo_ta}</p>
</article>
);
}
// Dùng: khoa.map(k => <The key={k.id} khoa={k} />)Tình huống: Danh sách khóa học
Trang web trung tâm có 12 khóa học. Viết một component The rồi lặp bằng map; thêm khóa mới chỉ cần thêm một phần tử vào mảng dữ liệu.
Mẹo hay
Một component nên nhỏ và làm một việc. Nếu hàm dài trên 100 dòng, hãy tách ra.
Lưu ý
Không dùng chỉ số mảng làm key khi danh sách có thể thêm/xóa/sắp xếp; hãy dùng id ổn định.
Thực hành
- Viết component
NutBamnhận props nhãn và màu. - Hiển thị danh sách 5 món ăn bằng map.
- Làm component
Thecó ảnh, tiêu đề, mô tả.
Tóm tắt bài học
- Component là hàm viết hoa trả về JSX.
- Props truyền xuống, chỉ đọc.
- Danh sách dùng
mapvàkey.