# Class and Style Bindings Vue 提供了 `class` 和 `style` 兩種 directives 的方法來連結綁定 class 和樣式。 ## Binding HTML Classes ### Object syntax 將一個 object 傳遞給 `:class` (`v-bind:class` 的語法糖) 來動態切換 classes ```jsx= <div :class="{ active: isActive }"></div> ``` `active` 為 class 名稱,`isActive` 是程式中的 truthy 或 boolean 當 `isActive` 為 true,就會產生 ```jsx= <div class="active"></div> ``` 可以使用多組動態 classes 並且和普通的 class 共存 ```jsx= <div class="static" :class="{ active: isActive, 'text-danger': hasError }" ></div> ``` ```javascript= data() { return { isActive: true, hasError: false } } ``` 上述的 html 和 js 就會產生 ```jsx= <div class="static active"></div> ``` `active` 和 `text-danger` 會因為 `isActive` 和 `hasError` 的真值而產生變化 且可以將 object 取出來,不必是 inline 樣式 ```jsx= <div :class="classObject"></div> ``` ```javascript= data() { return { classObject: { active: false, 'text-danger': true } } } ``` 這樣結果就會是 ```jsx= <div class="static text-danger"></div> ``` 還可以將 object 綁定到 `computed` property ```jsx= <div :class="classObject"></div> ``` ```javascript= data() { return { isActive: true, error: null } }, computed: { classObject() { return { active: this.isActive && !this.error, 'text-danger': this.error && this.error.type === 'fatal' } } } ``` 如此同樣會產生 ```jsx= <div class="static active"></div> ``` ### Array syntax 除了可以是 object,也可以將一組 classes 名稱的 array 傳遞給 `:class` ```jsx= <div :class="[activeClass, errorClass]"></div> ``` ```javascript= data() { return { activeClass: 'active', errorClass: 'text-danger' } } ``` 如此會產生 ```jsx= <div class="active text-danger"></div> ``` 如果要條件判別,可以使用三元表示法(ternary expression) ```jsx= <div :class="[isActive ? activeClass : '', errorClass]"></div> ``` 這樣子就會條件判斷是否有 `activeClass`,但是 `errorClass` 則是一定會有 另外還能再 array 中使用 object (避免太過冗長) ```jsx= <div :class="[{ active: isActive }, errorClass]"></div> ``` ### With Components 可以在 custom component 上使用 `class` (限定 single root element),如果原本在 component 就有設定 class 則會一起保留 例如: ```jsx= // parent.vue <div id="app"> <my-component class="baz boo"></my-component> </div> ``` ```jsx= // my-component.vue <template> <p class="foo bar">Hi!</p> </template> ``` 會 render 出 ```jsx= <p class="foo bar baz boo">Hi</p> ``` 同樣可以使用 binding ```jsx= <my-component :class="{ active: isActive }"></my-component> ``` 如果 `isActive` 為 true,就會生成 ```jsx= <p class="foo bar active">Hi</p> ``` 如果 component 有多個 root elements 則需要指定哪些需要 class ```jsx= // my-component.vue <template> <p :class="$attrs.class">Hi!</p> <span>This is a child component</span> </template> ``` ## Binding Inline Styles 透過 `:style` 可以直接指派 inline styles 給元件 ### Object Syntax `:style` 用起來像是純粹的 css,只是給予的值是 JavaScript object。給予的 css property names 必須是 `camelCase` 或是 `kebab-case` (就像 `kebab-case` 使用 `-` 區隔) ```jsx= <div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div> data() { return { activeColor: 'red', fontSize: 30 } } ``` 直接綁定一個物件會是一個好主意 ```jsx= <div :style="styleObject"></div> data() { return { styleObject: { color: 'red', fontSize: '13px' } } } ``` object syntax 也很常和 computed property 搭配使用 ### Array syntax `:style` 和 array syntax 組合可以指派多個 objects 給同一個元件 ```jsx= <div :style="[baseStyles, overridingStyles]"></div> ``` ### Auto-prefixing Vue 會自動加入 prefixes 給支援的 css properties ([vendor prefixes](https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix)) ### Multiple Values 可以指派 array 給同一個 css style property ```jsx= <div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div> ``` 瀏覽器會選用在支援的值中選擇最後一個來使用