類和樣式繫結
資料繫結中一個常見的需求是操作元素類列表和內聯樣式。由於 class
和 style
都是屬性,我們可以使用 v-bind
來動態地將它們賦值為字串,就像對其他屬性做的那樣。然而,嘗試使用字串連線來生成這些值可能會很煩人且容易出錯。因此,Vue在 v-bind
與 class
和 style
一起使用時提供了特殊的增強。除了字串外,表示式也可以計算為物件或陣列。
繫結HTML類
繫結到物件
我們可以將一個物件傳遞給 :class
(即 v-bind:class
),以動態切換類。
模板
<div :class="{ active: isActive }"></div>
上述語法意味著 active
類的存在將由資料屬性 isActive
的真假性決定。
你可以透過在物件中有更多欄位來切換多個類。此外,:class
指令也可以與普通的 class
屬性共存。所以給定以下狀態
js
const isActive = ref(true)
const hasError = ref(false)
和以下模板
模板
<div
class="static"
:class="{ active: isActive, 'text-danger': hasError }"
></div>
它將渲染
模板
<div class="static active"></div>
當 isActive
或 hasError
發生變化時,類列表將相應地更新。例如,如果 hasError
變為 true
,類列表將變為 "static active text-danger"
。
繫結的物件不必是內聯的
js
const classObject = reactive({
active: true,
'text-danger': false
})
模板
<div :class="classObject"></div>
這將渲染
模板
<div class="active"></div>
我們還可以繫結到返回物件的 計算屬性。這是一個常見且強大的模式
js
const isActive = ref(true)
const error = ref(null)
const classObject = computed(() => ({
active: isActive.value && !error.value,
'text-danger': error.value && error.value.type === 'fatal'
}))
模板
<div :class="classObject"></div>
繫結到陣列
我們可以將 :class
繫結到陣列,以應用一系列類。
js
const activeClass = ref('active')
const errorClass = ref('text-danger')
模板
<div :class="[activeClass, errorClass]"></div>
這將渲染
模板
<div class="active text-danger"></div>
如果你希望條件性地切換列表中的類,你可以使用三元表示式來完成
模板
<div :class="[isActive ? activeClass : '', errorClass]"></div>
此操作始終應用errorClass
,但只有當isActive
為真值時才會應用activeClass
。
然而,如果您有多個條件類,這可能會有些冗長。這就是為什麼您還可以在陣列語法內使用物件語法。
模板
<div :class="[{ [activeClass]: isActive }, errorClass]"></div>
使用元件
本節假設您已瞭解元件。您可以隨時跳過此部分,稍後再回來。
當您在具有單個根元素的元件上使用class
屬性時,這些類將新增到元件的根元素上,並與已存在的任何類合併。
例如,如果我們有一個名為MyComponent
的元件,其模板如下
模板
<!-- child component template -->
<p class="foo bar">Hi!</p>
然後在使用它時新增一些類
模板
<!-- when using the component -->
<MyComponent class="baz boo" />
渲染的HTML將如下所示
模板
<p class="foo bar baz boo">Hi!</p>
同樣,這也適用於類繫結
模板
<MyComponent :class="{ active: isActive }" />
當isActive
為真值時,渲染的HTML將如下所示
模板
<p class="foo bar active">Hi!</p>
如果您的元件有多個根元素,您需要定義哪個元素將接收此類。您可以透過使用$attrs
元件屬性來實現這一點
模板
<!-- MyComponent template using $attrs -->
<p :class="$attrs.class">Hi!</p>
<span>This is a child component</span>
模板
<MyComponent class="baz" />
將渲染
HTML
<p class="baz">Hi!</p>
<span>This is a child component</span>
您可以在傳遞屬性部分了解更多關於元件屬性繼承的資訊。
繫結內聯樣式
繫結到物件
:style
支援繫結到JavaScript物件值 - 它對應於HTML元素的style
屬性
js
const activeColor = ref('red')
const fontSize = ref(30)
模板
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
儘管建議使用駝峰命名法鍵,但:style
也支援短橫線連線的CSS屬性鍵(對應於它們在實際CSS中的使用) - 例如
模板
<div :style="{ 'font-size': fontSize + 'px' }"></div>
通常,直接繫結到樣式物件是一個好主意,這樣模板會更簡潔
js
const styleObject = reactive({
color: 'red',
fontSize: '30px'
})
模板
<div :style="styleObject"></div>
同樣,物件樣式繫結通常與返回物件的計算屬性一起使用。
繫結到陣列
我們可以將:style
繫結到多個樣式物件的陣列。這些物件將被合併並應用於同一元素
模板
<div :style="[baseStyles, overridingStyles]"></div>
自動字首化
當您在:style
中使用需要供應商字首的CSS屬性時,Vue會自動新增適當的prefix。Vue透過在執行時檢查當前瀏覽器支援哪些樣式屬性來實現這一點。如果瀏覽器不支援某個特定屬性,則將測試各種帶字首的變體,以嘗試找到受支援的屬性。
多個值
您可以為樣式屬性提供多個(帶字首的)值的陣列,例如
模板
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
這隻會渲染陣列中瀏覽器支援的最後一個值。在這個例子中,它將渲染display: flex
,對於支援flexbox無字首版本的瀏覽器。