SFC CSS Xususiyatlari
Scoped CSS
<style>
tegi scoped
atributiga ega bo'lganda, uning CSS'i faqat joriy komponent elementlariga qo'llaniladi. Bu Shadow DOM'da topilgan style inkapsulyatsiyasiga o'xshaydi. Bu bir nechta cheklovlarga ega, lekin hech qanday polyfill talab qilmaydi. Bu PostCSS yordamida quyidagi kodni transformatsiya qilish orqali amalga oshiriladi:
vue
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
Quyidagi kodga:
vue
<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template>
Farzand Komponent Root Elementlari
scoped
bilan, ota-ona komponentining stillari farzand komponentlarga o'tmaydi. Biroq, farzand komponentning root tuguni ham ota-onaning scoped CSS'i, ham farzandning scoped CSS'i ta'sirida bo'ladi. Bu dizayn bo'yicha, ota-ona farzand root elementini layout maqsadlarida stillash uchun.
Chuqur Selektirlar
Agar siz scoped
stillaridagi selektorni "chuqur" qilmoqchi bo'lsangiz, ya'ni farzand komponentlarga ta'sir qilish uchun, :deep()
psevdo-klassidan foydalanishingiz mumkin:
vue
<style scoped>
.a :deep(.b) {
/* ... */
}
</style>
Yuqoridagi kod quyidagiga kompilyatsiya qilinadi:
css
.a[data-v-f3f3eg9] .b {
/* ... */
}
TIP
v-html
bilan yaratilgan DOM kontenti scoped stillar ta'sirida bo'lmaydi, lekin siz ularni chuqur selektirlar yordamida stillashingiz mumkin.
Slotted Selektirlar
Default bo'yicha, scoped stillar <slot/>
tomonidan render qilingan kontentga ta'sir qilmaydi, chunki ular ularni uzatayotgan ota-ona komponentga tegishli deb hisoblanadi. Slot kontentini aniq nishonga olish uchun :slotted
psevdo-klassidan foydalaning:
vue
<style scoped>
:slotted(div) {
color: red;
}
</style>
Global Selektirlar
Agar siz faqat bitta qoidani global qo'llashni xohlasangiz, boshqa <style>
yaratish o'rniga :global
psevdo-klassidan foydalanishingiz mumkin (quyida ko'ring):
vue
<style scoped>
:global(.red) {
color: red;
}
</style>
Mahalliy va Global Stillarni Aralashtirish
Siz bir xil komponentda ham scoped, ham scoped bo'lmagan stillarni kiritishingiz mumkin:
vue
<style>
/* global stillar */
</style>
<style scoped>
/* mahalliy stillar */
</style>
Scoped Style Maslahatlari
Scoped stillar klasslarga bo'lgan ehtiyojni yo'q qilmaydi. Brauzerlar turli CSS selektirlarini render qilish usuli tufayli,
p { color: red }
scoped bo'lganda (ya'ni atribut selektori bilan birlashtirilganda) ko'p marta sekinroq bo'ladi. Agar siz klasslar yoki id'lardan foydalansangiz, masalan.example { color: red }
da, siz virtual ravishda bu ishlash pasayishini yo'q qilasiz.Rekursiv komponentlarda meros selektirlar bilan ehtiyot bo'ling!
.a .b
selektori bo'lgan CSS qoidasi uchun, agar.a
ga mos keladigan element rekursiv farzand komponentni o'z ichiga olsa, unda o'sha farzand komponentdagi barcha.b
lar qoida tomonidan mos keladi.
CSS Modullari
<style module>
tegi CSS Modullari sifatida kompilyatsiya qilinadi va natijada olingan CSS klasslarini komponentga $style
kaliti ostidagi ob'ekt sifatida ochadi:
vue
<template>
<p :class="$style.red">This should be red</p>
</template>
<style module>
.red {
color: red;
}
</style>
Natijada olingan klasslar to'qnashuvdan saqlash uchun hash'lanadi, bu CSS'ni faqat joriy komponentga scoped qilishning bir xil effektini beradi.
CSS Modullari spetsifikatsiyasi haqida global istisnolar va kompozitsiya kabi ko'proq ma'lumot uchun murojaat qiling.
Maxsus Inject Nomi
Siz inject qilingan klasslar ob'ektining xususiyat kalitini module
atributiga qiymat berish orqali sozlashingiz mumkin:
vue
<template>
<p :class="classes.red">red</p>
</template>
<style module="classes">
.red {
color: red;
}
</style>
Composition API bilan Ishlatish
Inject qilingan klasslarga setup()
va <script setup>
ichida useCssModule
API orqali kirish mumkin. Maxsus inject nomlariga ega <style module>
bloklari uchun, useCssModule
mos keladigan module
atribut qiymatini birinchi argument sifatida qabul qiladi:
js
import { useCssModule } from 'vue'
// setup() scope'ida...
// default, <style module> uchun klasslarni qaytaradi
useCssModule()
// nomlangan, <style module="classes"> uchun klasslarni qaytaradi
useCssModule('classes')
- Misol
vue
<script setup lang="ts">
import { useCssModule } from 'vue'
const classes = useCssModule()
</script>
<template>
<p :class="classes.red">red</p>
</template>
<style module>
.red {
color: red;
}
</style>
CSS'da v-bind()
SFC <style>
teglari v-bind
CSS funksiyasi yordamida CSS qiymatlarini dinamik komponent holatiga bog'lashni qo'llab-quvvatlaydi:
vue
<template>
<div class="text">hello</div>
</template>
<script>
export default {
data() {
return {
color: 'red'
}
}
}
</script>
<style>
.text {
color: v-bind(color);
}
</style>
Sintaksis <script setup>
bilan ishlaydi va JavaScript ifodalarini qo'llab-quvvatlaydi (qo'shtirnoq ichiga o'ralishi kerak):
vue
<script setup>
import { ref } from 'vue'
const theme = ref({
color: 'red',
})
</script>
<template>
<p>hello</p>
</template>
<style scoped>
p {
color: v-bind('theme.color');
}
</style>
Haqiqiy qiymat hash'langan CSS maxsus xususiyatiga kompilyatsiya qilinadi, shuning uchun CSS hali ham statik. Maxsus xususiyat komponentning root elementiga inline stillar orqali qo'llaniladi va manba qiymati o'zgarganda reaktiv ravishda yangilanadi.