Mô tả giao diện người dùng
React là một thư viện JavaScript để hiển thị giao diện người dùng (UI). UI được xây dựng từ các đơn vị nhỏ như nút, văn bản và hình ảnh. React cho phép bạn kết hợp chúng thành các component có thể tái sử dụng và lồng vào nhau. Từ các trang web đến ứng dụng điện thoại, mọi thứ trên màn hình đều có thể được chia thành các component. Trong chương này, bạn sẽ học cách tạo, tùy chỉnh và hiển thị có điều kiện các component React.
Trong chương này
- Cách viết component React đầu tiên của bạn
- Khi nào và làm thế nào để tạo các tệp nhiều component
- Cách thêm markup vào JavaScript bằng JSX
- Cách sử dụng dấu ngoặc nhọn với JSX để truy cập chức năng JavaScript từ các component của bạn
- Cách định cấu hình component với props
- Cách hiển thị có điều kiện các component
- Cách hiển thị nhiều component cùng một lúc
- Cách tránh các lỗi khó hiểu bằng cách giữ cho các component thuần khiết
- Tại sao việc hiểu UI của bạn dưới dạng cây lại hữu ích
Component đầu tiên của bạn
Các ứng dụng React được xây dựng từ các phần UI riêng biệt được gọi là component. Một component React là một hàm JavaScript mà bạn có thể thêm markup vào. Các component có thể nhỏ như một nút hoặc lớn như toàn bộ trang. Dưới đây là một component Gallery
hiển thị ba component Profile
:
function Profile() { return ( <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> ); } export default function Gallery() { return ( <section> <h1>Các nhà khoa học tuyệt vời</h1> <Profile /> <Profile /> <Profile /> </section> ); }
Ready to learn this topic?
Đọc Component Đầu Tiên Của Bạn để tìm hiểu cách khai báo và sử dụng các component React.
Read MoreNhập và xuất component
Bạn có thể khai báo nhiều component trong một tệp, nhưng các tệp lớn có thể gây khó khăn cho việc điều hướng. Để giải quyết vấn đề này, bạn có thể xuất một component vào tệp riêng của nó, sau đó nhập component đó từ một tệp khác:
import Profile from './Profile.js'; export default function Gallery() { return ( <section> <h1>Các nhà khoa học tuyệt vời</h1> <Profile /> <Profile /> <Profile /> </section> ); }
Ready to learn this topic?
Đọc Nhập và Xuất Component để tìm hiểu cách chia các component thành các tệp riêng của chúng.
Read MoreViết markup với JSX
Mỗi component React là một hàm JavaScript có thể chứa một số markup mà React hiển thị trong trình duyệt. Các component React sử dụng một phần mở rộng cú pháp gọi là JSX để biểu diễn markup đó. JSX trông rất giống HTML, nhưng nó chặt chẽ hơn một chút và có thể hiển thị thông tin động.
Nếu chúng ta dán markup HTML hiện có vào một component React, nó sẽ không phải lúc nào cũng hoạt động:
export default function TodoList() { return ( // Điều này không hoàn toàn hoạt động! <h1>Hedy Lamarr's Todos</h1> <img src="https://i.imgur.com/yXOvdOSs.jpg" alt="Hedy Lamarr" class="photo" > <ul> <li>Invent new traffic lights <li>Rehearse a movie scene <li>Improve spectrum technology </ul>
Nếu bạn có HTML hiện có như thế này, bạn có thể sửa nó bằng converter:
export default function TodoList() { return ( <> <h1>Hedy Lamarr's Todos</h1> <img src="https://i.imgur.com/yXOvdOSs.jpg" alt="Hedy Lamarr" className="photo" /> <ul> <li>Invent new traffic lights</li> <li>Rehearse a movie scene</li> <li>Improve spectrum technology</li> </ul> </> ); }
JavaScript trong JSX với dấu ngoặc nhọn
JSX cho phép bạn viết markup giống HTML bên trong tệp JavaScript, giữ cho logic hiển thị và nội dung ở cùng một nơi. Đôi khi bạn sẽ muốn thêm một chút logic JavaScript hoặc tham chiếu một thuộc tính động bên trong markup đó. Trong tình huống này, bạn có thể sử dụng dấu ngoặc nhọn trong JSX của mình để “mở một cửa sổ” cho JavaScript:
const person = { name: 'Gregorio Y. Zara', theme: { backgroundColor: 'black', color: 'pink' } }; export default function TodoList() { return ( <div style={person.theme}> <h1>{person.name}'s Todos</h1> <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> <ul> <li>Improve the videophone</li> <li>Prepare aeronautics lectures</li> <li>Work on the alcohol-fuelled engine</li> </ul> </div> ); }
Ready to learn this topic?
Đọc JavaScript trong JSX với Dấu Ngoặc Nhọn để tìm hiểu cách truy cập dữ liệu JavaScript từ JSX.
Read MoreTruyền props cho một component
Các component React sử dụng props để giao tiếp với nhau. Mỗi component cha có thể truyền một số thông tin cho các component con của nó bằng cách cung cấp cho chúng các props. Props có thể nhắc bạn về các thuộc tính HTML, nhưng bạn có thể truyền bất kỳ giá trị JavaScript nào thông qua chúng, bao gồm các đối tượng, mảng, hàm và thậm chí cả JSX!
import { getImageUrl } from './utils.js' export default function Profile() { return ( <Card> <Avatar size={100} person={{ name: 'Katsuko Saruhashi', imageId: 'YfeOqp2' }} /> </Card> ); } function Avatar({ person, size }) { return ( <img className="avatar" src={getImageUrl(person)} alt={person.name} width={size} height={size} /> ); } function Card({ children }) { return ( <div className="card"> {children} </div> ); }
Ready to learn this topic?
Đọc Truyền Props cho một Component để tìm hiểu cách truyền và đọc props.
Read MoreHiển thị có điều kiện
Các component của bạn thường sẽ cần hiển thị những thứ khác nhau tùy thuộc vào các điều kiện khác nhau. Trong React, bạn có thể hiển thị JSX có điều kiện bằng cú pháp JavaScript như câu lệnh if
, &&
và toán tử ? :
.
Trong ví dụ này, toán tử &&
của JavaScript được sử dụng để hiển thị có điều kiện một dấu kiểm:
function Item({ name, isPacked }) { return ( <li className="item"> {name} {isPacked && '✅'} </li> ); } export default function PackingList() { return ( <section> <h1>Danh sách đóng gói của Sally Ride</h1> <ul> <Item isPacked={true} name="Space suit" /> <Item isPacked={true} name="Helmet with a golden leaf" /> <Item isPacked={false} name="Photo of Tam" /> </ul> </section> ); }
Ready to learn this topic?
Đọc Hiển Thị Có Điều Kiện để tìm hiểu các cách khác nhau để hiển thị nội dung có điều kiện.
Read MoreHiển thị danh sách
Bạn thường sẽ muốn hiển thị nhiều component tương tự từ một tập hợp dữ liệu. Bạn có thể sử dụng filter()
và map()
của JavaScript với React để lọc và chuyển đổi mảng dữ liệu của bạn thành một mảng các component.
Đối với mỗi mục trong mảng, bạn sẽ cần chỉ định một key
. Thông thường, bạn sẽ muốn sử dụng ID từ cơ sở dữ liệu làm key
. Các key cho phép React theo dõi vị trí của từng mục trong danh sách ngay cả khi danh sách thay đổi.
import { people } from './data.js'; import { getImageUrl } from './utils.js'; export default function List() { const listItems = people.map(person => <li key={person.id}> <img src={getImageUrl(person)} alt={person.name} /> <p> <b>{person.name}:</b> {' ' + person.profession + ' '} known for {person.accomplishment} </p> </li> ); return ( <article> <h1>Scientists</h1> <ul>{listItems}</ul> </article> ); }
Ready to learn this topic?
Đọc Hiển Thị Danh Sách để tìm hiểu cách hiển thị danh sách các component và cách chọn key.
Read MoreGiữ cho các component thuần khiết
Một số hàm JavaScript là thuần khiết. Một hàm thuần khiết:
- Không can thiệp vào việc riêng. Nó không thay đổi bất kỳ đối tượng hoặc biến nào đã tồn tại trước khi nó được gọi.
- Đầu vào giống nhau, đầu ra giống nhau. Với cùng một đầu vào, một hàm thuần khiết sẽ luôn trả về cùng một kết quả.
Bằng cách chỉ viết các component của bạn dưới dạng các hàm thuần khiết, bạn có thể tránh được toàn bộ một lớp các lỗi khó hiểu và hành vi khó lường khi cơ sở mã của bạn phát triển. Dưới đây là một ví dụ về một component không thuần khiết:
let guest = 0; function Cup() { // Bad: changing a preexisting variable! guest = guest + 1; return <h2>Tea cup for guest #{guest}</h2>; } export default function TeaSet() { return ( <> <Cup /> <Cup /> <Cup /> </> ); }
Bạn có thể làm cho component này thuần khiết bằng cách truyền một prop thay vì sửa đổi một biến đã tồn tại:
function Cup({ guest }) { return <h2>Tea cup for guest #{guest}</h2>; } export default function TeaSet() { return ( <> <Cup guest={1} /> <Cup guest={2} /> <Cup guest={3} /> </> ); }
Ready to learn this topic?
Đọc Giữ Cho Các Component Thuần Khiết để tìm hiểu cách viết các component dưới dạng các hàm thuần khiết, có thể dự đoán được.
Read MoreUI của bạn dưới dạng một cây
React sử dụng cây để mô hình hóa các mối quan hệ giữa các component và module.
Một cây render React là một biểu diễn của mối quan hệ cha con giữa các component.


Một ví dụ về cây render React.
Các component gần đầu cây, gần component gốc, được coi là các component cấp cao nhất. Các component không có component con là các component lá. Việc phân loại các component này rất hữu ích để hiểu luồng dữ liệu và hiệu suất hiển thị.
Mô hình hóa mối quan hệ giữa các module JavaScript là một cách hữu ích khác để hiểu ứng dụng của bạn. Chúng ta gọi nó là cây phụ thuộc module.


Một ví dụ về cây phụ thuộc module.
Một cây phụ thuộc thường được sử dụng bởi các công cụ xây dựng để đóng gói tất cả mã JavaScript có liên quan để máy khách tải xuống và hiển thị. Kích thước bundle lớn làm giảm trải nghiệm người dùng cho các ứng dụng React. Hiểu cây phụ thuộc module là hữu ích để gỡ lỗi các vấn đề như vậy.
Ready to learn this topic?
Đọc UI Của Bạn Dưới Dạng Một Cây để tìm hiểu cách tạo cây render và cây phụ thuộc module cho một ứng dụng React và cách chúng là các mô hình tinh thần hữu ích để cải thiện trải nghiệm và hiệu suất người dùng.
Read MoreTiếp theo là gì?
Đi tới Component Đầu Tiên Của Bạn để bắt đầu đọc chương này từng trang một!
Hoặc, nếu bạn đã quen thuộc với các chủ đề này, tại sao không đọc về Thêm Tương Tác?