Vue css新特性

69 阅读1分钟

一、插槽选择器

1.1 环境搭建

1.1.1 创建插槽

创建 A.vue 页面,向外暴露一个插槽

<template>
    
    <div class="red">我是插槽a</div>
    
    <h2>
        <slot></slot>
    </h2>
</template>

<script setup lang="ts">

</script>

<style scoped>
.red{
    color: red;
}
</style>

1.1.2 使用插槽

<template>

    <A>
        <div class="red">这是插槽内容</div>
    </A>

</template>

<script setup lang='ts'>
import A from "./components/A.vue"

</script>

1.2 使用情景

1.2.1 问题

注意到由于插槽内容是父组件提供的,没有加载到子组件的样式

image.png

1.2.2 解决策略

为子组件的样式加上插槽选择器 :slotted(xxx)

:slotted(.red) {
    color: red;
}

image.png

二、全局选择器

2.1 问题

如果想定义全局样式,一般是使用如下格式,但是需要额外定义一个style(默认style都加上了scoped)

<style>
.red {
    color: red;
}
</style>

2.2 解决策略

加上全局选择器 :global(xxx)

<style scoped>
:global(.red){
    color: red;
}
</style>

三、动态css

image.png

四、css 模块化

4.1 基础使用

<template>
    
    <div :class="[$style.red,$style.border]">我是插槽a</div>

    <h2>
        <slot></slot>
    </h2>
</template>

<script setup lang="ts">

</script>

<style module>

.red{
    color: red;
}

.border{
    border:1px solid
}

</style>

image.png

4.2 划分模块

image.png

4.3 读取对象

image.png

<template>
    
    <div :class="[a.red,a.border]">我是插槽a</div>

    <h2>
        <slot></slot>
    </h2>
</template>

<script setup lang="ts">
import { useCssModule } from 'vue';

const css = useCssModule('a')
console.log(css)

</script>

<style module="a">

.red{
    color: red;
}

.border{
    border:1px solid
}

</style>
image.png