scoped
- scoped的原理
- vue中的scoped 通过在DOM结构以及css样式上加唯一不重复的标记:data-v-hash的方式,以保证唯一(而这个工作是由过PostCSS转译实现的),达到样式私有化模块化的目的。
- 总结一下scoped三条渲染规则:
-
- 给HTML的DOM节点加一个不重复data属性(形如:data-v-123)来表示他的唯一性
-
- 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-123])来私有化样式
-
- 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性
-
Vue 提供了样式穿透:deep() 他的作用就是用来改变 属性选择器的位置
.class-a: {
:deep(input) {
background: red;
}
}
1.插槽选择器
A 组件定义一个插槽
<template>
<div>
我是插槽
<slot></slot>
</div>
</template>
<script>
export default {}
</script>
<style scoped>
</style>
在App.vue 引入
<template>
<div>
<A>
<div class="a">私人定制div</div>
</A>
</div>
</template>
<script setup>
import A from "@/components/A.vue"
</script>
<style lang="less" scoped>
</style>
在A组件修改class a 的颜色
// 无效果
<style scoped>
.a{
color:red
}
</style>
默认情况下,作用域样式不会影响到 <slot/> 渲染出来的内容,因为它们被认为是父组件所持有并传递进来的。
解决方案 slotted
<style scoped>
:slotted(.a) {
color:red
}
</style>
2.全局选择器
- 在之前我们想加入全局 样式 通常都是新建一个style 标签 不加scoped 现在有更优雅的解决方案
<style>
div{
color:red
}
</style>
<style lang="less" scoped>
</style>
// 在scoped下写全局样式
<style lang="less" scoped>
:global(div){
color:red
}
</style>
3.动态 CSS
- 单文件组件的
<style>标签可以通过v-bind这一 CSS 函数将 CSS 的值关联到动态的组件状态上:
<template>
<div class="div">
是个弟弟
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const red = ref<string>('red')
</script>
<style lang="less" scoped>
.div{
color:v-bind(red)
}
</style>
- 如果是对象 v-bind 请加引号
<template>
<div class="div">
是个弟弟
</div>
</template>
<script lang="ts" setup>
import { ref } from "vue"
const red = ref({
color:'pink'
})
</script>
<style lang="less" scoped>
.div {
color: v-bind('red.color');
}
</style>
4.css module
<style module>标签会被编译为 CSS Modules 并且将生成的 CSS 类作为$style对象的键暴露给组件
<template>
<div :class="$style.red">
小满是个弟弟
</div>
</template>
<style module>
.red {
color: red;
font-size: 20px;
}
</style>
- 自定义注入名称(多个可以用数组)
- 你可以通过给
moduleattribute 一个值来自定义注入的类对象的 property 键
<template>
<div :class="[zs.red,zs.border]">
是个弟弟
</div>
</template>
<style module="zs">
.red {
color: red;
font-size: 20px;
}
.border{
border: 1px solid #ccc;
}
</style>
- 与组合式 API 一同使用
- 注入的类可以通过 useCssModule API 在
setup()和<script setup>中使用。对于使用了自定义注入名称的<style module>模块,useCssModule接收一个对应的moduleattribute 值作为第一个参数
<template>
<div :class="[zs.red,zs.border]">
小满是个弟弟
</div>
</template>
<script setup lang="ts">
import { useCssModule } from 'vue'
const css = useCssModule('zs')
</script>
<style module="zs">
.red {
color: red;
font-size: 20px;
}
.border{
border: 1px solid #ccc;
}
</style>
- 使用场景一般用于TSX 和 render 函数 居多