Powiązania klas i stylów
Częstą potrzebą w wiązaniu danych jest manipulowanie listą klas elementu i stylami inline. Ponieważ class
i style
są atrybutami, możemy użyć v-bind
, aby dynamicznie przypisać im wartość tekstową, podobnie jak w przypadku innych atrybutów. Jednak generowanie tych wartości poprzez powiązanie łańcuchów znaków może być uciążliwe i podatne na błędy. Z tego powodu Vue zapewnia specjalne ulepszenia, gdy v-bind
jest używany z class
i style
. Oprócz łańcuchów znaków, wyrażenia mogą również zwracać obiekty lub tablice.
Wiązanie klas HTML
Wiązanie z obiektami
Możemy przekazać obiekt do :class
(skrót od v-bind:class
), aby dynamicznie przełączać klasy:
template
<div :class="{ active: isActive }"></div>
Powyższa składnia oznacza, że obecność klasy active
będzie zależała od prawdziwości (truthiness) właściwości danej isActive
.
Możesz przełączać wiele klas, dodając więcej pól do obiektu. Dodatkowo dyrektywa :class
może współistnieć ze zwykłym atrybutem class
. Przyjmując następujący stan:
js
const isActive = ref(true)
const hasError = ref(false)
Oraz następujący szablon:
template
<div
class="static"
:class="{ active: isActive, 'text-danger': hasError }"
></div>
Wyrenderuje to:
template
<div class="static active"></div>
Kiedy wartości isActive
lub hasError
się zmienią, lista klas zostanie odpowiednio zaktualizowana. Na przykład, jeśli hasError
zmieni się na true
, lista klas stanie się "static active text-danger"
.
Obiekt powiązany nie musi być zapisany inline:
js
const classObject = reactive({
active: true,
'text-danger': false
})
template
<div :class="classObject"></div>
Wyrenderuje:
template
<div class="active"></div>
Możemy także powiązać klasę z właściwością computed, która zwraca obiekt. Jest to częsty i skuteczny wzorzec:
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'
}))
template
<div :class="classObject"></div>
Wiązanie z tablicami
Możemy powiązać :class
z tablicą, aby zastosować listę klas:
js
const activeClass = ref('active')
const errorClass = ref('text-danger')
template
<div :class="[activeClass, errorClass]"></div>
Co wyrenderuje:
template
<div class="active text-danger"></div>
Jeśli chcesz warunkowo dodać klasę do listy, możesz użyć wyrażenia trójskładnikowego (ternary expression):
template
<div :class="[isActive ? activeClass : '', errorClass]"></div>
To zawsze będzie dotyczyć errorClass
, ale activeClass
będzie stosowane tylko wtedy, gdy isActive
będzie true.
Jednak może to być trochę rozwlekłe, jeśli masz wiele klas warunkowych. Dlatego możliwe jest również użycie składni obiektu wewnątrz składni tablicy:
template
<div :class="[{ [activeClass]: isActive }, errorClass]"></div>
Z komponentami
Ta sekcja zakłada znajomość komponentów. Możesz ją pominąć i wrócić do niej później.
Kiedy używasz atrybutu class
w komponencie z pojedynczym elementem root, te klasy zostaną dodane do elementu root komponentu i połączone z już istniejącymi klasami.
Na przykład, jeśli mamy komponent o nazwie MyComponent
z następującym szablonem:
template
<!-- szablon komponentu dziecka -->
<p class="foo bar">Hi!</p>
Następnie dodajemy klasy przy jego użyciu:
template
<!-- podczas używania komponentu -->
<MyComponent class="baz boo" />
Wygenerowany HTML będzie wyglądał następująco:
template
<p class="foo bar baz boo">Cześć!</p>
To samo dotyczy powiązań klas:
template
<MyComponent :class="{ active: isActive }" />
Kiedy isActive
jest wartością truthy, wygenerowany HTML będzie wyglądał następująco:
template
<p class="foo bar active">Cześć!</p>
Jeśli Twój komponent ma wiele elementów root, musisz określić, który element otrzyma tę klasę. Możesz to zrobić używając właściwości $attrs
komponentu:
template
<!-- Szablon komponentu MyComponent z użyciem $attrs -->
<p :class="$attrs.class">Cześć!</p>
<span>This is a child component</span>
template
<MyComponent class="baz" />
Wyrenderuje to:
html
<p class="baz">Cześć!</p>
<span>To jest komponent dziecka</span>
Możesz dowiedzieć się więcej o dziedziczeniu atrybutów komponentów w sekcji atrybuty przechodzące.
Wiązanie stylów inline
Wiązanie z obiektami
:style
obsługuje wiązanie z wartościami obiektów JavaScript — odpowiada właściwości style
elementu HTML:
js
const activeColor = ref('red')
const fontSize = ref(30)
template
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
Chociaż zalecane są klucze pisane z użyciem camelCase, :style
obsługuje również klucze właściwości CSS w formacie kebab (odpowiada to sposobowi ich użycia w rzeczywistym CSS) - na przykład:
template
<div :style="{ 'font-size': fontSize + 'px' }"></div>
Często dobrym pomysłem jest bezpośrednie powiązanie z obiektem stylu, aby szablon był czystszy:
js
const styleObject = reactive({
color: 'red',
fontSize: '30px'
})
template
<div :style="styleObject"></div>
Ponownie, powiązanie stylu obiektu jest często używane w połączeniu z obliczonymi właściwościami, które zwracają obiekty.
Dyrektywy :style
mogą również być użyte obok normalnych atrybutów style, tak jak :class
.
Szablon:
template
<h1 style="color: red" :style="'font-size: 1em'">hello</h1>
Wyrenderuje:
template
<h1 style="color: red; font-size: 1em;">hello</h1>
Wiązanie z tablicami
Możemy powiązać :style
z tablicą wielu obiektów stylu. Te obiekty zostaną scalone i zastosowane do tego samego elementu:
template
<div :style="[baseStyles, overridingStyles]"></div>
Automatyczne dodawanie prefiksu
Gdy używasz właściwości CSS, która wymaga prefiksu dostawcy w :style
, Vue automatycznie doda odpowiedni prefiks. Vue robi to, sprawdzając w czasie wykonywania, które właściwości stylu są obsługiwane w bieżącej przeglądarce. Jeśli przeglądarka nie obsługuje określonej właściwości, zostaną przetestowane różne warianty z prefiksem, aby spróbować znaleźć taką, która jest obsługiwana.
Wiele wartości
Możesz podać tablicę wielu (z prefiksem) wartości do właściwości stylu, na przykład:
template
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
To spowoduje wyświetlenie tylko ostatniej wartości w tablicy obsługiwanej przez przeglądarkę. W tym przykładzie zostanie wyświetlona wartość display: flex
dla przeglądarek obsługujących wersję flexbox bez prefiksu.