Thành phần UI tái sử dụng: đặt tên, biến thể và quy tắc bố cục
Đặt quy tắc rõ ràng về đặt tên, biến thể và bố cục cho các thành phần UI tái sử dụng để đội ngũ xây màn hình nhất quán và nhanh chóng trong bất kỳ visual builder nào.

Tại sao tính nhất quán màn hình bị phá trong visual builder
Visual builder giúp triển khai màn hình nhanh. Chính tốc độ đó cũng có thể che đi sự trôi dần chậm trong cách giao diện trông và hoạt động. Khi nhiều người cùng xây dựng, các lựa chọn nhỏ cộng dồn: người thì thêm 12px padding, người khác dùng 16px, người thứ ba sao chép một nút cũ từ màn hình khác.
Bạn thường nhận ra triệu chứng sớm: thành phần gần như trùng lặp, khoảng cách thay đổi giữa các màn hình và những từ hơi khác nhau cho cùng một hành động (Lưu, Gửi, Xác nhận). Trạng thái cũng thường lệch: một form hiển thị trạng thái loading rõ ràng, form khác thì không. Thông báo lỗi khác nhau, và các “ sửa nhanh ” xuất hiện trên một trang nhưng không bao giờ quay lại mẫu chung.
Đó là cách nợ UI bắt đầu. Mỗi điểm không nhất quán có vẻ nhỏ, nhưng theo thời gian làm sản phẩm kém tin cậy hơn. Nó cũng làm chậm đội vì mọi người mất thời gian tìm “phiên bản đúng”, so sánh màn hình và sửa những khác biệt nhỏ vào giai đoạn review.
Thư viện thành phần trong visual builder là tập hợp khối dựng sẵn (nút, trường, thẻ, tiêu đề, trạng thái rỗng) mà mọi người kéo vào thay vì tạo lại. Trong nền tảng như AppMaster, điều này thường có nghĩa là tạo các mảnh UI tái sử dụng bên trong visual UI builders, rồi thống nhất cách đặt tên, cấu hình và bố trí để màn hình giữ nhất quán ngay cả khi nhiều người khác nhau xây dựng.
Mục tiêu không phải loại bỏ sự sáng tạo, mà là làm phần thường nhật trở nên dự đoán được để mọi lựa chọn đều có chủ ý. Bốn cần gạt ngăn trôi là: đặt tên rõ ràng, biến thể hợp lý, quy tắc bố cục cơ bản (khoảng cách, căn chỉnh, lưới) và thói quen đội giúp thư viện khỏe lên khi app lớn dần.
Nên thành phần nào tái sử dụng (và không nên thành phần nào)
Không phải mọi yếu tố đẹp đều đáng trở thành thành phần. Nếu biến mọi thứ thành thành phần, người ta sẽ lãng phí thời gian lục trong thư viện và chỉnh những tuỳ chọn không nên tồn tại.
Một thành phần tái sử dụng tốt là thứ bạn kỳ vọng sẽ xuất hiện trên nhiều màn hình, hoặc thứ phải trông và hoạt động giống nhau mỗi lần. Nghĩ đến các mẫu người dùng nhận ra ngay: nút chính, trường văn bản có chú giải, thẻ xem trước một bản ghi.
Một bộ khởi đầu nhỏ thường đáp ứng hầu hết màn hình: nút, input, thẻ, tiêu đề trang và vài kiểu modal (xác nhận và form).
Một quy tắc trích thực tế giữ quyết định đơn giản: nếu bạn dùng cùng một UI 2 đến 3 lần, hoặc nó quan trọng với thương hiệu và cần giống hệt, thì trích thành phần. Nếu chỉ xuất hiện một lần, giữ nó cục bộ.
Cái gì nên là một lần duy nhất? Bố cục rất đặc thù gắn với một màn hình, phần thử nghiệm bạn thay đổi hàng ngày, và nội dung chủ yếu. Ví dụ, banner onboarding chỉ dùng một lần với text và minh hoạ tuỳ chỉnh hiếm khi đáng để thành thành phần.
Giữ mỗi thành phần tập trung. Một thành phần nên làm một việc. “Thẻ Người Dùng” vừa hiển thị vừa xử lý quyền, trạng thái thanh toán và hành động admin sẽ khó tái sử dụng. Cách tốt hơn là một “Thẻ Người Dùng” chỉ hiển thị, và các nút hành động, chip trạng thái tách riêng.
Quy ước đặt tên dễ đọc khi vội
Khi đội chạy nhanh, tên là thứ đầu tiên vỡ. Ai đó nhân đôi “Button2”, người khác tạo “CTA Button”, người thứ ba dùng “BlueButton”. Một tuần sau, chẳng ai biết dùng cái nào, nên họ tạo thêm một cái mới. Đó là cách thư viện trở thành một đống gần trùng.
Một mẫu đơn giản giúp giữ nhất quán ngay cả khi mệt: Component - Part - State. Hầu hết thành phần không cần cả ba, nhưng thứ tự duy trì như vậy.
Dùng từ mọi người thực sự nói. Nếu đội bạn gọi là “Thẻ Khách hàng”, đừng đặt tên “CRM Tile”. Nếu sản phẩm gọi là “Plan”, đừng gọi là “SubscriptionBox”. Ngôn ngữ đơn giản thắng vì dễ tìm.
Một quy tắc ngăn nhầm lẫn: đừng trộn “trông như thế nào” và “dùng để làm gì” ở cùng một lớp. Chọn một phương pháp. Nếu đặt tên theo mục đích, tránh từ màu. Nếu đặt tên theo hình thức, tránh ý nghĩa nghiệp vụ. Đặt tên theo mục đích thường mở rộng tốt hơn.
Ví dụ dễ quét trong danh sách thành phần:
- Nút - Chính
- Nút - Phụ - Vô hiệu hóa
- Input - CóNhãn
- Thẻ - Gọn
- Modal - Xác nhậnXoá
Quyết định định dạng một lần và ghi ra: Title Case hay sentence case, có dấu cách quanh gạch ngang hay không, và không viết tắt trừ khi phổ quát (ví dụ “URL”). Trong các visual builder có nhiều người đóng góp, những lựa chọn nhỏ này giúp thư viện dễ đọc khi danh sách lớn dần.
Biến thể: cách cung cấp lựa chọn mà không gây hỗn loạn
Biến thể cho phép một thành phần dùng được ở nhiều chỗ mà không phải nhân đôi. Bí quyết là quyết định trước sự khác biệt nào quan trọng và khoá mọi thứ còn lại.
Bắt đầu với vài chiều biến thể bao phủ nhu cầu thực tế. Với nhiều thành phần, ba chiều là đủ: kích thước (S/M/L), mục đích (primary/secondary/danger), và trạng thái (mặc định/hover/active). Nếu tuỳ chọn mới không phù hợp những chiều đó, hãy xem đó là một thành phần mới, không phải “thêm một biến thể nữa”.
Mặc định quan trọng hơn bạn nghĩ. Màn hình mới nên trông đúng ngay cả khi ai đó kéo thành phần vào và không thay gì. Đặt mặc định an toàn (ví dụ size=M, intent=primary, state=default) để tốc độ không biến thành style ngẫu nhiên.
Với mỗi thành phần có biến thể, hãy ghi ra và bắt buộc:
- Các chiều được hỗ trợ và giá trị cho phép (giữ ngắn)
- Giá trị mặc định
- Những thứ không bao giờ thay đổi giữa các biến thể (padding, font, bo góc, khoảng cách icon)
- Trạng thái bắt buộc như disabled và loading, cộng thêm error khi có thể thất bại
- Khi nào tạo thành phần mới thay vì thêm biến thể
Ví dụ: bạn có một nút “Submit” trong portal khách hàng. Nếu một người làm “Wide Submit Button” và người khác làm “Rounded Submit Button”, trôi dạt hiện ngay. Với quy tắc, bạn giữ một thành phần Button. Cho phép kích thước và mục đích, cấm padding và bo góc tuỳ chỉnh, và định nghĩa “Loading” một lần (hiện spinner, khoá click) để hành vi giống nhau khắp nơi.
Khi ai đó xin “thêm một style nữa”, hãy hỏi vấn đề người dùng nó giải quyết là gì. Nếu câu trả lời mơ hồ, rất có thể đó là hỗn loạn đội lừa.
Quy tắc bố cục: khoảng cách, căn chỉnh và lưới mọi người tuân theo
Nếu quy tắc bố cục mơ hồ, từng màn hình dần thành một cái riêng. Cách nhanh nhất để giữ thành phần nhất quán là làm khoảng cách và căn chỉnh nhàm chán: vài lựa chọn cho phép, dùng giống nhau mỗi lần.
Bắt đầu với một thang khoảng cách và cấm tất cả giá trị khác. Chọn một tập nhỏ (ví dụ 4, 8, 12, 16, 24) và xem nó như bàn phím: bạn có thể chơi nhiều bài, nhưng chỉ với những phím đó. Nếu ai đó cần “18px”, thường nghĩa là thành phần hoặc lưới sai.
Hãy rõ ràng về ý nghĩa của từng loại khoảng cách:
- Padding là bên trong thành phần và nhất quán trên mọi màn hình.
- Gap là khoảng giữa các phần tử bên trong một container (hàng form, mục toolbar).
- Margin là bên ngoài thành phần và nên dùng tiết chế.
- Ưu tiên gap hơn margin chồng để khoảng cách không bị cộng đôi vô tình.
Quy tắc căn chỉnh loại bỏ những chỉnh “kéo nắn một chút” vô tận. Một mặc định đơn giản hoạt động tốt: căn trái cho văn bản, thẳng hàng nhãn và input trên cùng một đường thẳng đứng, và giữ hành động chính nhất quán (ví dụ ở góc phải dưới trong modal và căn phải trong footer form). Dùng baseline alignment cho các hàng nhiều chữ. Dự trữ căn giữa cho các hàng chỉ có icon.
Lưới không cần phức tạp nhưng phải tồn tại. Quyết định số cột và gutter, và định nghĩa hành vi trên màn hình nhỏ hơn (ngay cả “12 cột trên desktop, một cột trên mobile” cơ bản cũng hữu ích). Thiết lập chiều rộng container và breakpoint một lần, rồi xây màn hình trong các hàng đó.
Bẫy phổ biến cần chú ý: container lồng nhau mỗi cái thêm padding, margin trang không nhất quán, trộn chiều rộng cố định với cột responsive, và các “số ma thuật” chỉ sửa được một màn hình.
Token style: font, màu và những nguyên tắc tiếp cận khả năng dùng
Token kiểu là các lựa chọn chia sẻ mọi người dùng. Khi token rõ ràng, thành phần UI tái sử dụng vẫn nhất quán dù nhiều người khác nhau xây màn hình.
Bắt đầu với typography như nguồn duy nhất: chọn một thang nhỏ cho kích thước chữ, weight và line-height, rồi dừng. Hầu hết đội chỉ cần vài bước (ví dụ: body, small, caption, title, page heading). Đặt những lựa chọn đó ở một nơi để văn bản mới bắt đầu từ cùng mặc định.
Màu tốt nhất khi đặt tên theo ý nghĩa, không theo mã màu. “Primary” báo hiệu hành động chính. “Success” nghĩa “thành công”, “warning” nghĩa “cần kiểm tra”. Tránh tên như “blue-500” trừ khi đội bạn đã quen với palettes.
Những nguyên tắc tiếp cận giúp tránh vấn đề sau này:
- Đảm bảo chữ có độ tương phản đủ với nền.
- Làm target chạm đủ lớn cho ngón tay, không chỉ con trỏ chuột.
- Viết thông báo lỗi nói rõ chuyện gì xảy ra và cần làm gì tiếp theo.
- Đừng chỉ dùng màu để truyền trạng thái.
Token nên liên kết trực tiếp đến biến thể thành phần. Một Button biến thể Primary, Secondary hoặc Danger nên hoán đổi các token được phê duyệt (màu, border, kiểu chữ), không thêm style riêng lẻ.
Giữ danh sách token ngắn để mọi người thực sự dùng. Kiểm tra tốt: ai đó có chọn đúng token trong 5 giây không? Nếu không, gộp hoặc xoá.
Một bộ khởi đầu đơn giản có thể gồm typography (text.body, text.small, text.title), màu (color.primary, color.success, color.warning, color.danger), khoảng cách (space.8, space.16, space.24), bo góc (radius.sm, radius.md) và focus (focus.ring).
Các bước: thiết lập thư viện thành phần trong visual builder
Thư viện thành phần ít liên quan đến “hoàn thiện thiết kế” hơn là loại bỏ các quyết định vi mô hàng ngày. Khi mọi người chọn cùng khối xây dựng, màn hình giữ nhất quán ngay cả khi người khác nhau xây dựng.
Một triển khai 5 bước thực tế
-
Kiểm kê những gì đã có. Chọn 5–10 màn hình thực tế và ghi lại các phần trùng lặp xuất hiện thường xuyên: nút, input, tiêu đề phần, thẻ và trạng thái rỗng.
-
Chọn đợt đầu nhỏ để chuẩn hoá. Nhắm tới 10 phần xuất hiện khắp nơi và gây nhiều khác biệt nhất. Với nhiều đội đó là nút, input, dropdown, dialog modal, header bảng và thẻ.
-
Ghi quy tắc trước khi xây. Giữ ngắn: tên thành phần, khi dùng, biến thể được phép và quy tắc bố cục xung quanh (khoảng cách, căn chỉnh, chiều rộng).
-
Xây lại một lần, rồi thay thế dần. Tạo thành phần mới trong visual builder và khoá những biến thể đã thỏa thuận. Thay thế các bản sao cũ từng màn hình. Đừng cố refactor mọi thứ trong một sprint.
-
Thêm một cổng review nhẹ. Một người (luân phiên hàng tuần) kiểm tra thành phần và biến thể mới. Mục tiêu không phải kiểm duyệt mà là ngăn nhánh vô ý.
“Đủ tốt” trông thế nào
Bạn sẽ biết nó hiệu quả khi một designer hoặc PM nói: “Dùng thẻ chuẩn với header gọn,” và hai người xây ra kết quả giống nhau. Đó là lợi ích: ít lựa chọn một-off hơn, ít khác biệt tinh vi hơn và xây màn hình nhanh hơn.
Giữ thư viện nhỏ có chủ ý. Nếu ai đó đề nghị biến thể mới, hỏi một câu trước: đây có nhu cầu thật sự không, hay biến thể hiện có có thể đáp ứng với nội dung khác?
Sai lầm phổ biến khiến UI chậm và không nhất quán
Hầu hết không nhất quán không phải do kém thẩm mỹ mà do sao chép dễ, chỉnh nhanh và không ai quay lại. Kết quả là tập các màn hình gần giống nhau nhưng khó cập nhật.
Một bẫy phổ biến là tạo bản gần trùng thay vì thêm biến thể. Ai đó cần “nút primary hơi cao hơn” và nhân đôi thành phần. Một tuần sau, người khác nhân đôi nữa. Bây giờ bạn có ba nút trông gần giống nhưng hành vi khác nhau, và mọi sửa đổi là cuộc săn lùng.
Một trì hoãn khác là thành phần quá cấu hình: một thành phần khổng lồ với hàng chục toggle. Ban đầu thấy linh hoạt, rồi trở nên không đoán trước được. Mọi người ngừng tin tưởng và tạo phiên bản “chỉ cho trường hợp này”, làm vô hiệu mục đích.
Sai lầm bố cục gây hại không kém. Lỗi lớn nhất là trộn trách nhiệm: thành phần tự điều khiển margin ngoài trong khi màn hình cũng thêm khoảng cách. Bạn sẽ có khoảng trống lộn xộn tuỳ trang. Một quy tắc đơn giản giúp: thành phần định nghĩa padding nội bộ, màn hình kiểm soát khoảng cách giữa các thành phần.
Vấn đề thường xuất hiện đầu tiên: quy tắc đặt tên vỡ khi vội, trạng thái thêm muộn (loading, empty, error), sửa một-off thành permanent, và nhiều người giải quyết cùng một layout khác nhau.
Checklist nhanh để giữ nhất quán cho mọi màn hình mới
Trước khi thêm gì mới, dừng 60 giây và kiểm tra cơ bản. Một màn hình có thể trông ổn nhưng âm thầm phá hệ thống, và những vết rạn nhỏ đó tích tụ nhanh khi nhiều người cùng xây.
- Đặt tên: Mọi thành phần theo mẫu đã thống nhất (ví dụ
Form/Input,Form/Input.HelperText,Table/RowActions). Nếu tên không giúp ai đó tìm và đặt nhanh, đổi tên ngay. - Chủ sở hữu + mục đích: Mỗi thành phần chia sẻ có một owner (người hoặc đội) và một câu mô tả khi dùng.
- Chỉ dùng thang khoảng cách: Tất cả padding, gap và margin dùng bước khoảng cách đã phê duyệt. Nếu bạn gõ số mới “vì trông đúng”, dừng lại và chọn bước gần nhất.
- Bao gồm trạng thái: Các phần tương tác chính có trạng thái loading và error chứ không chỉ happy path. Nghĩ đến nút disabled, lỗi input, danh sách rỗng, retry.
- Không tạo style mới: Xây màn hình bằng token và thành phần hiện có. Nếu cần màu, kích thước chữ, bo góc hoặc shadow mới, xử lý như yêu cầu hệ thống, không sửa màn hình cục bộ.
Ví dụ: hai người xây cùng tính năng, có và không có quy tắc
Maya và Leon trên đội hỗ trợ khách hàng cần hai màn hình: danh sách ticket (để quét nhanh) và màn hình chi tiết ticket (để thao tác). Họ chia công và xây trong visual builder.
Không có quy tắc, mỗi người làm “một thẻ” khác nhau. Maya dùng thẻ trắng viền mỏng và shadow. Leon dùng thẻ xám không viền nhưng padding lớn hơn. Một màn hình có nút primary bo góc, màn kia dùng nút vuông và link text. Trạng thái hiện dưới dạng chấm màu trên màn kia và pill trên màn kia. Trên trang chi tiết, các trường không thẳng hàng vì nhãn có chiều rộng khác, nên toàn bộ form lỏng lẻo.
Cuộc họp review chuyển thành tranh luận style, và cập nhật đơn giản (thêm “Priority”) buộc chỉnh nhiều layout một-off.
Có quy tắc, họ bắt đầu từ thư viện thành phần chung nhỏ: TicketCard cho cấu trúc và khoảng cách, StatusBadge cho style trạng thái và tương phản, và ActionBar cho hành động chính nhất quán.
Giờ danh sách dùng biến thể TicketCard gọn cho các trường chính và một dòng xem trước. Màn chi tiết dùng biến thể chi tiết cho mô tả đầy đủ, timeline và các trường thêm. Cấu trúc giữ nguyên; biến thể quyết định thứ xuất hiện.
Phần tốt nhất là những thứ bạn không thấy: ít comment review hơn, ít câu hỏi “tại sao khác nhau?”, và cập nhật nhanh hơn sau này. Khi đội đổi tên “Closed” thành “Resolved” và điều chỉnh màu, họ sửa StatusBadge một lần và cả hai màn cùng cập nhật.
Giữ nhất quán theo thời gian (và bước tiếp theo)
Nhất quán không phải thiết lập một lần. Khi nhiều người xây màn hình, những lựa chọn “chỉ cho trang này” nhân lên và thư viện bắt đầu trôi.
Một quy trình thay đổi đơn giản giữ đội tiến mà không biến mọi sửa nút thành cuộc tranh luận:
- Đề xuất: thay đổi gì và vì sao (thành phần mới, biến thể mới, đổi tên, ngừng dùng)
- Review: designer hoặc owner UI kiểm tra đặt tên, quy tắc khoảng cách và cơ bản về accessibility
- Phê duyệt: đồng ý hay không, kèm ghi chú ngắn nếu chỉ giới hạn cho luồng cụ thể
- Phát hành: cập nhật thư viện chia sẻ và thông báo ở một nơi duy nhất
Quyết định cần có “nhà”. Một tài liệu ngắn “quy tắc UI” là đủ nếu bao gồm quy ước đặt tên, danh sách biến thể chính thức (cái gì có và không có) và danh sách không được làm (ví dụ: “Đừng tạo một ‘Primary Button’ thứ hai với padding khác”).
Lên lịch dọn dẹp hàng tháng. Dùng thời gian đó để gộp trùng, xóa phần không dùng và đánh dấu các thành phần cũ là deprecated để mọi người ngừng lấy nhầm.
Refactor khi bạn thấy cùng một mẫu hai lần (ví dụ hai đội làm empty state hơi khác nhau). Chấp nhận một lần duy nhất khi thật sự duy nhất, cần gấp và ít khả năng lặp lại.
Nếu bạn xây trong AppMaster, bước tiếp thực tế là chuẩn hoá một workflow trước (như “Create ticket” hoặc “Checkout”), sau đó mở rộng. Các UI builders giúp chia sẻ cùng thành phần giữa các màn, và appmaster.io là tài liệu tham khảo hữu ích nếu đội muốn cách tiếp cận no-code mà vẫn hỗ trợ ứng dụng đầy đủ, không chỉ bố cục trang.
Câu hỏi thường gặp
Bắt đầu bằng cách chuẩn hoá các phần bạn chạm tới hầu như trên mọi màn hình: nút, trường nhập, thẻ, tiêu đề phần và một hai kiểu modal. Xây những cái đó thành thành phần tái sử dụng trước, đặt mặc định hợp lý, rồi thay thế các bản sao cũ từng màn hình thay vì cố refactor mọi thứ trong một lần.
Một quy tắc hữu dụng là trích thành phần khi bạn đã dùng cùng một UI hai hoặc ba lần, hoặc khi nó phải trông và hoạt động hoàn toàn giống nhau mỗi lần (ví dụ: hành động chính hoặc trường biểu mẫu). Nếu nó thực sự chỉ dùng một lần, gắn với một màn hình, hoặc thay đổi hàng ngày, hãy giữ nó cục bộ để thư viện dễ dùng hơn.
Dùng một mẫu đặt tên đơn giản và giữ nhất quán, ví dụ “Component - Part - State”. Ưu tiên từ ngữ đội bạn thực sự dùng, và tránh tên dựa trên màu như “BlueButton” vì khi style đổi tên sẽ gây nhầm lẫn.
Giữ biến thể giới hạn ở những khác biệt xuất hiện lặp lại và quan trọng, như kích thước, mục đích (primary/secondary/danger) và trạng thái. Phần còn lại nên bị khoá để mọi người không “tinh chỉnh” thành phần theo từng màn hình và tạo ra trôi dạt. Nếu yêu cầu mới không phù hợp với chiều biến thể hiện có, thường đó là một thành phần mới, không phải “thêm một tuỳ chọn”.
Chọn một thang khoảng cách nhỏ và chỉ dùng những bước đó trên toàn app; bất cứ giá trị nào khác nên được xem là tín hiệu lưới hoặc thành phần không đúng. Ưu tiên dùng gap của container thay vì margin chồng để tránh khoảng cách bị cộng đôi khi các thành phần lồng nhau.
Dùng token được đặt tên theo ý nghĩa, không phải mã màu thô, để đội chọn “primary” hay “danger” thay vì tạo ra các sắc thái mới. Sau đó đảm bảo các biến thể thành phần ánh xạ đến các token đó, để “Primary Button” luôn kéo đúng kiểu chữ và màu trên mọi nơi.
Mỗi thành phần tương tác chung nên có ít nhất trạng thái disabled và loading, và thêm trạng thái lỗi khi có khả năng thất bại (như biểu mẫu hay hành động mạng). Nếu trạng thái không được chuẩn hoá, màn hình sẽ cảm thấy không đồng nhất ngay cả khi nhìn tương tự, làm giảm tin cậy và tăng thời gian review.
Thành phần cấu hình quá mức nhìn thì linh hoạt nhưng khiến hành vi khó dự đoán, và mọi người sẽ dần mất niềm tin vào nó. Giữ thành phần tập trung vào một nhiệm vụ, và ghép UI lớn hơn từ các mảnh nhỏ hơn để việc tái sử dụng đơn giản và thay đổi không gây hiệu ứng phụ.
Dùng một cổng kiểm soát nhẹ: một người chịu trách nhiệm luân phiên kiểm tra các thành phần và biến thể mới về đặt tên, quy tắc khoảng cách và trạng thái cần thiết. Mục tiêu là ngăn các nhánh vô ý sớm, vì gộp các bản gần trùng sau này rất chậm và thường phá màn hình.
Trong AppMaster, tạo các mảnh UI tái sử dụng trong web và mobile UI builders, rồi chuẩn hoá cách đặt tên, cấu hình và bố trí để người khác có thể dùng lại tự tin. Một cách thực tế là chuẩn hoá một luồng công việc trước (ví dụ “Create ticket”), điều chỉnh các thành phần và biến thể ở đó, rồi mở rộng thư viện khi nhiều màn hình áp dụng cùng mẫu.


