Vue Class and Style Bindings
Mục lục
1. Diagram
- Class Binding Overview
- Class Binding Flow
- Style Binding Overview
- Component Class Inheritance
- Auto-prefixing
2. Tổng quan
3. Binding HTML Classes
4. Binding Inline Styles
5. Common Patterns
6. Best Practices
7. Kết luận
1. Diagram
Class Binding Overview
- Class binding trong Vue cho phép thêm/xóa class CSS một cách linh hoạt dựa trên data.
- Cú pháp:
- Object Syntax:
{ active: isActive, 'text-danger': hasError } - Array Syntax:
[activeClass, errorClass]
- Object Syntax:
- Vue sẽ tự động theo dõi và cập nhật class khi data thay đổi.
Class Binding Flow
Data Change
|
v
Reactivity System detects change
|
v
Re-evaluate class bindings
|
v
Update class list on the element
Style Binding Overview
- Style binding trong Vue cho phép thêm/xóa style inline một cách linh hoạt dựa trên data.
- Cú pháp:
- Object Syntax:
{ color: activeColor, fontSize: fontSize + 'px' } - Array Syntax:
[baseStyles, overridingStyles]
- Object Syntax:
- Vue sẽ tự động theo dõi và cập nhật style khi data thay đổi.
Component Class Inheritance
- Class của component cha sẽ tự động áp dụng cho component con.
- Có thể ghi đè class của component cha trong component con.
- Sử dụng
inheritAttrs: falseđể ngăn chặn kế thừa thuộc tính không mong muốn.
Auto-prefixing
CSS Property Change
|
v
Reactivity System detects change
|
v
Add vendor prefixes if needed
|
v
Update style on the element
2. Tổng quan
- Vue cung cấp nhiều cách để bind class và style cho phần tử trong template.
- Binding có thể dựa trên điều kiện, cho phép tạo giao diện linh hoạt và động.
- Hiểu rõ cách hoạt động của class và style binding giúp tối ưu hiệu suất và khả năng bảo trì code.
3. Binding HTML Classes
1. Object Syntax
- Cú pháp:
v-bind:class="{ active: isActive, 'text-danger': hasError }" - Ví dụ:
<div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div> - Khi
isActivelàtrue→ classactiveđược thêm vào phần tử. - Khi
hasErrorlàtrue→ classtext-dangerđược thêm vào phần tử.
2. Array Syntax
- Cú pháp:
v-bind:class="[classA, classB]"hoặcv-bind:class="[classObject, arrayOfClasses]" - Ví dụ:
<div v-bind:class="[baseClass, { active: isActive }]"></div> baseClassluôn luôn có mặt.- Nếu
isActivelàtrue→ classactiveđược thêm vào phần tử.
3. With Components
- Khi sử dụng với component, class sẽ được thêm vào root element của component đó.
- Ví dụ:
<my-component v-bind:class="{ active: isActive }"></my-component> - Class
activesẽ được thêm vào phần tử gốc củamy-componentnếuisActivelàtrue.
4. Binding Inline Styles
1. Object Syntax
- Cú pháp:
v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }" - Ví dụ:
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div> - Khi
activeColorthay đổi → thuộc tínhcolorcủa phần tử sẽ thay đổi theo. - Khi
fontSizethay đổi → thuộc tínhfont-sizecủa phần tử sẽ thay đổi theo.
2. Array Syntax
- Cú pháp:
v-bind:style="[baseStyles, overridingStyles]"hoặcv-bind:style="[styleObject, arrayOfStyles]" - Ví dụ:
<div v-bind:style="[baseStyle, { color: activeColor }]"></div> baseStyleluôn luôn có mặt.- Nếu
activeColorthay đổi → thuộc tínhcolorcủa phần tử sẽ thay đổi theo.
3. Auto-prefixing
- Vue tự động thêm prefix cho các thuộc tính CSS cần thiết.
- Ví dụ:
v-bind:style="{ display: flex }"sẽ được biên dịch thànhdisplay: -webkit-box; display: -ms-flexbox; display: flex; - Giúp đảm bảo tính tương thích với các trình duyệt cũ.
4. Multiple Values
- Có thể bind nhiều giá trị cho cùng một thuộc tính CSS.
- Ví dụ:
<div v-bind:style="{ display: isFlex ? 'flex' : 'block', color: activeColor }" ></div> - Khi
isFlexlàtrue→ thuộc tínhdisplaysẽ làflex, ngược lại sẽ làblock. - Thuộc tính
colorsẽ nhận giá trị từactiveColor.
5. Common Patterns
- Toggle class on/off:
<div v-bind:class="{ active: isActive }"></div> - Dynamic class based on condition:
<div v-bind:class="isActive ? 'active' : 'inactive'"></div> - Multiple classes:
<div v-bind:class="[baseClass, isActive ? 'active' : '']"></div> - Computed class:
<div v-bind:class="computedClass"></div>
6. Best Practices
- Sử dụng computed properties cho các logic phức tạp.
- Tránh lạm dụng inline style, nên sử dụng class để dễ dàng bảo trì.
- Tổ chức và đặt tên class có ý nghĩa, dễ hiểu.
- Sử dụng CSS Modules hoặc Scoped CSS trong Vue để tránh xung đột tên class.
7. Kết luận
- Class và style binding trong Vue rất mạnh mẽ và linh hoạt.
- Hiểu rõ cách sử dụng giúp tạo ra giao diện người dùng động và hấp dẫn.
- Luôn tuân thủ các best practices để đảm bảo code sạch sẽ, dễ bảo trì và hiệu suất cao.