Vue 2.7 v-if, v-else-if, v-else, and v-show conditional rendering directives.
Conditional Rendering
Hiển thị hoặc ẩn phần tử dựa trên điều kiện. Trong AEM, dữ liệu thường đến từ Sling Model qua data attribute, nên điều kiện hay dùng để hiện block khi field có giá trị, ẩn khi rỗng.
v-if / v-else-if / v-else
v-if render phần tử khi điều kiện đúng. Khi sai, phần tử không tồn tại trong DOM.
Quy tắc: v-else và v-else-if phải nằm ngay sau phần tử có v-if (hoặc v-else-if), không được chèn phần tử khác ở giữa.
v-show
v-show luôn render phần tử vào DOM, chỉ bật/tắt bằng CSS display.
Khi isVisible sai, DOM vẫn có phần tử nhưng style="display: none".
v-if vs v-show
Quy tắc chọn:
- Toggle thường xuyên (tab, dropdown, accordion): dùng
v-show. - Điều kiện ít đổi hoặc block nặng có thể không bao giờ hiện: dùng
v-if.
Điều kiện cho nhóm phần tử với template
v-if chỉ áp cho một phần tử. Cần điều kiện cho nhiều phần tử mà không thêm thẻ bọc thừa thì dùng <template> (không render ra DOM).
v-show không dùng được với <template>.
v-if với v-for
Không đặt v-if và v-for trên cùng một phần tử. Ở Vue 2, v-for ưu tiên cao hơn v-if, nên v-if chạy lại cho từng item, gây khó đọc và tốn hiệu năng.
Cách đúng: lọc bằng computed trước, hoặc bọc v-if ra ngoài.
Điều kiện áp cho cả danh sách thì bọc ngoài bằng <template v-if>:
key để kiểm soát tái sử dụng phần tử
Khi toggle giữa hai nhánh cùng loại phần tử, Vue tái sử dụng DOM cũ để tối ưu, có thể giữ lại state không mong muốn (vd giá trị input). Thêm key khác nhau để ép Vue render lại phần tử mới.
Tips cho AEM
HTL đã render fallback HTML server-side. Khi Vue mount lên, dùng điều kiện để hiện block tương ứng dữ liệu từ Sling Model.
Ưu tiên v-if cho block phụ thuộc field tùy chọn (có thể rỗng) để DOM gọn. Dùng v-show cho phần đóng/mở liên tục theo tương tác người dùng.