操作元素的 class 列表和內聯樣式是數據綁定的一個常見需求。因為它們都是屬性,所以我們可以用 `v-bind` 處理它們:只需要通過表達式計算出字符串結果即可。不過,字符串拼接麻煩且易錯。因此,在將 `v-bind` 用于 `class` 和 `style` 時,Vue.js 做了專門的增強。表達式結果的類型除了字符串之外,還可以是對象或數組。
## 綁定 HTML Class
### 對象語法
我們可以傳給 `v-bind:class` 一個對象,以動態地切換 class:
``` html
<div v-bind:class="{ active: isActive }"></div>
```
上面的語法表示 `active` 這個 class 存在與否將取決于數據屬性 `isActive` 的 [truthiness](https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy)。
你可以在對象中傳入更多屬性來動態切換多個 class。此外,`v-bind:class` 指令也可以與普通的 class 屬性共存。當有如下模板:
``` html
<div class="static"
v-bind:class="{ active: isActive, 'text-danger': hasError }">
</div>
```
和如下 data:
``` js
data: {
isActive: true,
hasError: false
}
```
結果渲染為:
``` html
<div class="static active"></div>
```
當 `isActive` 或者 `hasError` 變化時,class 列表將相應地更新。例如,如果 `hasError` 的值為 `true`,class 列表將變為 `"static active text-danger"`。
綁定的數據對象不必內聯定義在模板里:
``` html
<div v-bind:class="classObject"></div>
```
``` js
data: {
classObject: {
active: true,
'text-danger': false
}
}
```
渲染的結果和上面一樣。我們也可以在這里綁定一個返回對象的[計算屬性](computed.html)。這是一個常用且強大的模式:
``` html
<div v-bind:class="classObject"></div>
```
``` js
data: {
isActive: true,
error: null
},
computed: {
classObject: function () {
return {
active: this.isActive && !this.error,
'text-danger': this.error && this.error.type === 'fatal'
}
}
}
```
### 數組語法
我們可以把一個數組傳給 `v-bind:class`,以應用一個 class 列表:
``` html
<div v-bind:class="[activeClass, errorClass]"></div>
```
``` js
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
```
渲染為:
``` html
<div class="active text-danger"></div>
```
如果你也想根據條件切換列表中的 class,可以用三元表達式:
``` html
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
```
這樣寫將始終添加 `errorClass`,但是只有在 `isActive` 是 truthy<sup>[[1]](#footnote-1)</sup> 時才添加 `activeClass`。
不過,當有多個條件 class 時這樣寫有些繁瑣。所以在數組語法中也可以使用對象語法:
``` html
<div v-bind:class="[{ active: isActive }, errorClass]"></div>
```
### 用在組件上
> 這個章節假設你已經對 [Vue 組件](components.html)有一定的了解。當然你也可以先跳過這里,稍后再回過頭來看。
當在一個自定義組件上使用 `class` 屬性時,這些類將被添加到該組件的根元素上面。這個元素上已經存在的類不會被覆蓋。
例如,如果你聲明了這個組件:
``` js
Vue.component('my-component', {
template: '<p class="foo bar">Hi</p>'
})
```
然后在使用它的時候添加一些 class:
``` html
<my-component class="baz boo"></my-component>
```
HTML 將被渲染為:
``` html
<p class="foo bar baz boo">Hi</p>
```
對于帶數據綁定 class 也同樣適用:
``` html
<my-component v-bind:class="{ active: isActive }"></my-component>
```
當 `isActive` 為 truthy<sup>[[1]](#footnote-1)</sup> 時,HTML 將被渲染成為:
``` html
<p class="foo bar active">Hi</p>
```
## 綁定內聯樣式
### 對象語法
`v-bind:style` 的對象語法十分直觀——看著非常像 CSS,但其實是一個 JavaScript 對象。CSS 屬性名可以用駝峰式 (camelCase) 或短橫線分隔 (kebab-case,記得用單引號括起來) 來命名:
``` html
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
```
``` js
data: {
activeColor: 'red',
fontSize: 30
}
```
直接綁定到一個樣式對象通常更好,這會讓模板更清晰:
``` html
<div v-bind:style="styleObject"></div>
```
``` js
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
```
同樣的,對象語法常常結合返回對象的計算屬性使用。
### 數組語法
`v-bind:style` 的數組語法可以將多個樣式對象應用到同一個元素上:
``` html
<div v-bind:style="[baseStyles, overridingStyles]"></div>
```
### 自動添加前綴
當 `v-bind:style` 使用需要添加[瀏覽器引擎前綴](https://developer.mozilla.org/zh-CN/docs/Glossary/Vendor_Prefix)的 CSS 屬性時,如 `transform`,Vue.js 會自動偵測并添加相應的前綴。
### 多重值
> 2.3.0+
從 2.3.0 起你可以為 `style` 綁定中的屬性提供一個包含多個值的數組,常用于提供多個帶前綴的值,例如:
``` html
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
```
這樣寫只會渲染數組中最后一個被瀏覽器支持的值。在本例中,如果瀏覽器支持不帶瀏覽器前綴的 flexbox,那么就只會渲染 `display: flex`。
<small>
**譯者注**
<a id="footnote-1"></a>[1] truthy 不是 `true`,詳見 [MDN](https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy) 的解釋。
</small>
- 寫在前面
- 基礎
- 安裝
- 介紹
- Vue實例
- 模板語法
- 計算屬性和偵聽器
- Class 與 Style 綁定
- 條件渲染
- 列表渲染
- 事件處理
- 表單輸入綁定
- 組件基礎
- 深入了解組件
- 組件注冊
- Prop
- 自定義事件
- 插槽
- 動態組件 & 異步組件
- 處理邊界情況
- 過渡 & 動畫
- 進入/離開 & 列表過渡
- 狀態過渡
- 可復用性 & 組合
- 混入
- 自定義指令
- 渲染函數 & JSX
- 插件
- 過濾器
- 工具
- 生產環境部署
- 單文件組件
- 單元測試
- TypeScript 支持
- 規模化
- 路由
- 狀態管理
- 服務端渲染
- 內在
- 深入響應式原理
- 遷移
- 從 Vue 1.x 遷移
- 從 Vue Router 0.7.x 遷移
- 從 Vuex 0.6.x 遷移到 1.0
- 更多
- 對比其他框架
- 加入 Vue.js 社區
- 開發團隊