Chỉ dẫn để thiết kế React Component

Tốt hơn, tốt nữa, tốt mãi, luôn là điều mình muốn, ngoài chuyện viết cho nó chạy đúng, viết thế nào tốt nhất nên là mục tiêu khi làm việc

Đây là tổng hợp những quan điểm thiết kế component sao cho tốt, chứ không phải là chuẩn mực gì hết, theo quan điểm cá nhân người viết - là mình đây, không hề là chuẩn mực công nghiệp gì cả.

Thử hình dung, chúng ta có một component với khoảng hơn chục prop, dựa trên các prop truyền vào, component sẽ cho ra kết quả khác nhau, một nhu cầu tất yếu, tuy nhiên nếu hạn chế được ít chừng nào thì tốt chừng ấy, gần như số lượng prop của component quá nhiều thì chúng ta sẽ không nhớ nổi cần những gì cho component đó, lúc nào chúng ta cũng phải mở ra đọc docs, đôi khi mở source ra để check logic bên trong nó.

Single Responsibility Principle

Nếu 1 component đang có quá nhiều prop, nó đang ôm đồm quá nhiều công việc, hãy nhớ đến nguyên tắc Single Responsibility Principle (SRP), tạm dịch là ai làm việc nấy, chia component đó ra thành các component nhỏ hơn, từng component giải quyết từng vấn đề.

Export

Một kiểu viết mình rất thích, thay vì export component <TableRow/>, <TableCell/>, mình sẽ export component dạng <Table.Row/>, <Table.Cell/>

import Table from './Table';
import TableRow from './TableRow';
import TableCell from './TableCell';

Table.Cell = TableCell;
Table.Row = TableRow;

export {
  TableCell,
  TableRow
}

export default Table;

Nếu bạn không hiểu vì sao mình có thể gọi <Table.Row/>, <Table.Cell/>, mình giải thích luôn, lợi dụng đặc điểm biến kiểu reference, tham khảo lại bài này, thằng TableCell và Table.Cell đều tham chiếu đến cùng vùng nhớ

Type check

Luôn dùng type check cho component, thời điểm hiện tại mình khuyến khích dùng Flow, nó đảm bảo rằng component sẽ được truyền đúng giá trị prop nó cần, đồng thời lúc gõ ra mình cũng sẽ thấy được danh sách các prop của component đó trên editor

Chỉ dẫn để thiết kế React Component

Consistance

Luôn thống nhất trong hệ thống component đang build, không thể lúc vui bạn dùng prop tên disable chổ khác dùng enable, nếu được thì chỉ chọn 1 trong 2 thôi.

Ví dụ khác, nếu component cho phép truyền vào biến màu sắc, chổ này bạn dùng variant="primary|secondary|danger", chổ kia bạn lại dùng color="blue|grey|red" thì hết sức khó chịu cho người khác.

Naming

Về cách đặt tên prop, luôn đặt tên cho dễ hình dung được công dụng của component đó làm nhiệm vụ gì, ảnh hưởng gì đến component

Giờ lấy ví dụ một component rất phổ biến <Alert />

Chỉ dẫn để thiết kế React Component

Thường chúng ta sẽ tạo ra component có các prop kiểu này

<Alert>Thông báo</Alert>
<Alert success>Thành công</Alert>
<Alert warning>Cảnh báo</Alert>
<Alert danger>Hư mẹ rồi</Alert>

Rất rõ ràng sạch sẽ, xúc tích. Tuy nhiên nếu chúng ta dùng theo kiểu sau

<Alert success warning>Thành công</Alert>

Sẽ có những anh developer ngu ngu ngơ ngơ dùng như vậy thật đấy. Tất nhiên nếu chúng ta là người viết cái <Alert/> chúng ta sẽ không đời nào truyền vào kiểu vậy. Nếu truyền vào kiểu như vậy thì nó render ra cái gì, đó mà đoán được. Một giải pháp được khuyến khích

<AlertBetter>Thông báo</AlertBetter>
<AlertBetter type="success">Thành công</AlertBetter>
<AlertBetter type="warning">Cảnh báo</AlertBetter>
<AlertBetter type="danger">Hư mẹ rồi</AlertBetter>

Nguồn tham khảo và tổng hợp

Chỉ dẫn để thiết kế React Component