做者:Michael Thiessen
譯者:前端小智
來源:forum.vuejs.org/
點贊再看,養成習慣本文
GitHub
https://github.com/qq44924588... 上已經收錄,更多往期高贊文章的分類,也整理了不少個人文檔,和教程資料。歡迎Star和完善,你們面試能夠參照考點複習,但願咱們一塊兒有點東西。前端
可以向組件添加動態類名是很是強大的功能。它使咱們能夠更輕鬆地編寫自定義主題,根據組件的狀態添加類,還能夠編寫依賴於樣式的組件的不一樣變體。vue
添加動態類名與在組件中添加 prop :class="classname"
同樣簡單。不管classname
的計算結果是什麼,都將是添加到組件中的類名。git
固然,對於Vue中的動態類,咱們能夠作的還有不少。在本文中,咱們將討論不少內容:github
在Vue中,咱們能夠向組件添加靜態類和動態類。面試
靜態類是那些永遠不會改變的乏味類,它們將始終出如今組件中。另外一方面,咱們能夠在應用程序中添加和刪除動態類。segmentfault
添加靜態類與在常規HTML中所作的是徹底相同的數組
<template> <span class="description"> This is how you add static classes in Vue. </span> </template>
動態類很是相似,可是咱們必須使用Vue的特殊屬性語法v-bind
,以便將 JS 表達式綁定到咱們的類:app
<template> <span v-bind:class="'description'"> This is how you add static classes in Vue. </span> </template>
這裏你會注意到,咱們必須在動態類名周圍添加額外的引號。工具
這是由於v-bind
語法接受咱們做爲 JS 值傳遞的任何內容。添加引號能夠確保Vue將其視爲字符串。佈局
Vue還有一個v-bind
的簡寫語法:
<template> <span :class="'description'"> This is how you add static classes in Vue. </span> </template>
真正奇妙的是,您甚至能夠在同一個組件上同時擁有靜態類和動態類。靜態類用於咱們知道不會更改的內容,好比定位和佈局,動態類用於主題之類的:
<template> <span class="description" :class="theme" > This is how you add static classes in Vue. </span> </template> export default { data() { return { theme: 'blue-theme', }; } }; ---------------------------------------- .blue-theme { color: navy; background: white; }
在本例中,theme
是包含咱們將應用的類名的變量。
因爲v-bind
能夠接受任何 JS 表達式,所以咱們能夠用它作一些很是酷的事情。我最喜歡的是在模板中使用三元表達式,它每每是很是乾淨和可讀的。
<template> <span class="description" :class="darkMode ? 'dark-theme' : 'light-theme'" > This is how you add dynamic classes in Vue. </span> </template>
若是darkMode
爲true
,則將dark-theme
用做咱們的類名。 不然,咱們選擇light-theme
。
若是須要動態添加許多不一樣的類,可使用數組或對象。這兩種方法都頗有用,咱們先來看數組方式。
由於咱們只是在計算一個 JS 表達式,因此能夠將咱們剛剛學到的表達式與數組語法結合起來
<template> <span class="description" :class="[ fontTheme, darkMode ? 'dark-theme' : 'light-theme', ]" > This is how you add dynamic classes in Vue. </span> </template>
咱們使用數組在這個元素上設置兩個動態類名。fontTheme
的值是一個類名,它將改變字體的外觀。在前面的例子中,咱們仍然可使用darkMode
變量在dark-theme
和light-theme
之間切換。
咱們甚至可使用對象來定義動態類的列表,這給了咱們更多的靈活性。
對於任何值爲真的鍵/值對,它將把鍵用做類名。讓咱們看一個對象語法的例子:
<template> <span class="description" :class="{ 'dark-theme': darkMode, 'light-theme': !darkMode, ]" > This is how you add dynamic classes in Vue. </span> </template>
咱們的對象包含兩個鍵:dark-theme
和light-theme
。與咱們以前實現的邏輯相似,咱們但願基於darkMode
的值在這些主題之間切換。
當darkMode
爲 true
時,會把dark-theme
做爲一個動態類名應用於咱們的元素。可是light-them
不會被應用,由於!darkMode
值爲false
。
如今咱們已經介紹了向Vue組件動態添加類的基礎知識。那麼如何使用本身的自定義組件來作到這一點?
假設咱們在 app 中有一個自定義組件
<template> <MovieList :movies="movies" :genre="genre" /> </template>
若是咱們要動態添加一個將更改主題的類,咱們該怎麼辦?其實很簡單。
咱們只須要像之前那樣添加:class
屬性
<template> <MovieList :movies="movies" :genre="genre" :class="darkMode ? 'dark-theme' : 'light-theme'" /> </template>
之因此起做用,是由於Vue直接在MovieList
的根元素上設置類。
在組件上設置props
時,Vue會將這些props與組件在其props
部分中指定的props進行比較。 若是有匹配項,它將做爲常規props傳遞。 不然,Vue會將其添加到根DOM元素中。
在這裏,因爲MovieList
沒有指定class
屬性,所以Vue知道應該在根元素上進行設置。
不過,咱們能夠用動態類名作一些更高級的事情。
咱們已經介紹了許多動態添加或刪除類名的不一樣方法。可是動態生成類名自己又如何呢?
假設有一個Button
組件,它爲全部不一樣類型的按鈕提供20種不一樣的CSS樣式。
你可能不想花一成天的時間把每一項都寫出來,也不想把開關的邏輯都寫出來。相反,咱們將動態生成要應用的類的名稱。
<template> <span class="description" :class="theme" > This is how you add static classes in Vue. </span> </template> export default { data() { return { theme: 'blue-theme', }; } }; .blue-theme { color: navy; background: white; }
咱們能夠設置一個變量來包含咱們想要的任何類名的字符串。若是咱們想對Button
組件執行此操做,則能夠執行如下簡單操做:
<template> <button @click="$emit('click')" class="button" :class="theme" > {{ text }} </button> </template> export default { props: { theme: { type: String, default: 'default', } } }; .default {} .primary {} .danger {}
如今,使用Button
組件的任何人均可以將theme
屬性設置爲他們想要使用的任何主題。
若是沒有設置任何類,它將添加.default
類。若是將其設置爲primary
,則會添加.primary
類。
最終,模板中的表達式將變得過於複雜,並將開始變得很是混亂和難以理解。幸運的是,咱們有一個簡單的解決方案,就是使用計算民屬性:
<template> <MovieList :movies="movies" :genre="genre" :class="class" /> </template> export default { computed: { class() { return darkMode ? 'dark-theme' : 'light-theme'; } } };
這不只易於閱讀,並且還能夠輕鬆添加新功能並在未來進行重構。
代碼部署後可能存在的BUG無法實時知道,過後爲了解決這些BUG,花了大量的時間進行log 調試,這邊順便給你們推薦一個好用的BUG監控工具 Fundebug。
原文:https://forum.vuejs.org/t/add...
乾貨系列文章彙總以下,以爲不錯點個Star,歡迎 加羣 互相學習。
https://github.com/qq44924588...
我是小智,公衆號「大遷世界」做者,對前端技術保持學習愛好者。我會常常分享本身所學所看的乾貨,在進階的路上,共勉!
關注公衆號,後臺回覆福利,便可看到福利,你懂的。