Rumah >hujung hadapan web >View.js >Vue3 mempelajari analisis mendalam tentang Modul dan Skop CSS
Modul Css menukar nama kelas label kepada nama kelas yang unik, seperti .class ditukar kepada .class_abc_123, serupa dengan simbol, nama kunci unik
Skop CSS mencapai pengasingan skop dengan menambahkan atribut tersuai pada elemen dan menambah nombor unik pada atribut ini.
Modul CSS Prinsip modularisasi CSS adalah berdasarkan apa yang kami takrifkan dalam fail konfigurasi Peraturan penamaan nama kelas untuk kelas mencapai pengasingan skop. [Cadangan berkaitan: tutorial video vuejs, pembangunan bahagian hadapan web]
<style module> .title { font-size: 14px; font-family: Microsoft YaHei, Microsoft YaHei-Bold; font-weight: 700; color: #13161b; } .name { display: flex; align-items: center; &-img { width: 24px; height: 24px; border-radius: 4px; } &-text { font-size: 14px; font-family: Microsoft YaHei, Microsoft YaHei-Regular; font-weight: 400; color: #13161b; } } </style>
cell: (h, { col, row }) => { // console.log(style); return ( <span class={style.name}> <img src={testImage} class={style['name-img']} /> <span class={style['name-text']}>{row.name}</span> </span> ); },
<template> <div class="example">hi</div> </template> <style module> .example { color: red; } </style>Selepas penukaran
<!-- 用自定义属性把类名封装起来了 --> <style> .example[data-v-f3f3eg9] { color: red; } </style> <template> <div class="example" data-v-f3f3eg9>hi</div> </template>Mohon
Dalam Vue3, Modul CSS, tambah modul pada
Atribut , iaitu. c9ccee2e6ea535a969eb3f532ad9fe89
a6167d77ee734aaef6dcd2aa69de7b33
blok kod disusun ke dalam Modul CSS dan kelas CSS yang dihasilkan didedahkan kepada komponen sebagai kunci kepada objek
, yang boleh digunakan terus dalam templat a6167d77ee734aaef6dcd2aa69de7b33
. Untuk Modul CSS yang dinamakan seperti $style
, kelas CSS yang dijana selepas penyusunan didedahkan kepada komponen sebagai kunci objek $style
, iaitu, walau apa pun nilai atribut 5e86aa419b2f64de951546affb43f1b7
, objek itu terdedah. content
module
<script setup> import { useCssModule } from 'vue' // 不传递参数,获取<style module>代码块编译后的css类对象 const style = useCssModule() console.log(style.success) // 获取到的是success类名经过 hash 计算后的类名 // 传递参数content,获取<style module="content">代码块编译后的css类对象 const contentStyle = useCssModule('content') </script> <template> <div>普通style red</div> <div :class="$style.success">默认CssModule pink</div> <div :class="style.success">默认CssModule pink</div> <div :class="contentStyle.success">具名CssModule blue</div> <div :class="content.success">具名CssModule blue</div> </template> <!-- 普通style --> <style> .success { color: red; } </style> <!-- 无值的css module --> <style module> .success { color: pink; } </style> <!-- 具名的css module --> <style module="content"> .success { color: blue; } </style>Ambil perhatian bahawa Modul CSS dengan nama yang sama akan menimpa yang sebelumnya.
Untuk pembezaan penamaan modul, ia digunakan terutamanya dalam komponen JSX dan TSX
Gunakan dalam komponen Jsx dan TsxContohnya, tulis fungsi h dalam skrip dan gunakan pembolehubah gaya terus
Contohnya fungsi rendercell: (h, { col, row }) => { // console.log(style); return ( <span class={style.name}> <img src={testImage} class={style['name-img']} /> <span class={style['name-text']}>{row.name}</span> </span> ); },
<script> export default { props: { text: { type: String, default: '' } }, render(h) { return <span class={this.$style.span1}>hello 222 - {this.text}</span>; } }; </script> <style module> .span1 { color: blue; font-size: 40px; } </style>: pemilih global
: global() membenarkan pengisytiharan dalam kurungan Pemilih mencapai global , iaitu, nama kelasnya tidak akan dirangkumkan oleh peraturan, jadi ia tidak dihadkan oleh skop.
Dalam projek sebenar, apabila kita ingin mengubah suai gaya lalai perpustakaan komponen yang digunakan, apabila menggunakan penyelesaian Modul CSS, kita boleh mengubah suai gaya lalainya melalui: global(),
tetapi Ambil perhatian bahawa ia adalah yang terbaik untuk mempunyai enkapsulasi kelas di luar, jika tidak, ia boleh menjejaskan gaya global.
: pemilih tindakan mendalam dalam/* 转化前 */ <style scoped> .a :deep(.b) { /* ... */ } </style> /* 转化后 */ .a[data-v-f3f3eg9] .b { /* ... */ }
Beberapa kaedah penulisan pemilih kiri dan kanan dalam:
/deep/: usang
sebaliknya::v- deep
CSS Modules | Scoped CSS |
---|---|
需要在vue.config.js中额外配置 | Vue Loader默认支持,无需额外配置 |
通过根据配置的类命名规则,为元素生成独一无二的类名来实现作用域隔离 | 通过给元素自定义hash属性,再使用属性选择器选中元素来实现作用域隔离 |
在style标签中声明module | 在style标签中声明scoped |
支持导入其他module的样式,支持样式组合 | / |
通过:global()来解除作用域的隔离,使样式在全局生效 | 1. 可以定义全局样式,使样式不受作用域约束;2. 可以通过深度作用选择器命中子组件,从而控制子组件的样式 |
(Mempelajari perkongsian video: tutorial pengenalan vuejs, Video pengaturcaraan asas)
Atas ialah kandungan terperinci Vue3 mempelajari analisis mendalam tentang Modul dan Skop CSS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!