美文网首页
vue3 Style Module实战

vue3 Style Module实战

作者: GuitarHusky | 来源:发表于2023-10-23 09:12 被阅读0次

    scoped

    在vue中,因为组件化的缘故,我们需要使用到样式隔离来避免样式的污染和冲突。目前使用比较多的还是在style上添加scoped属性。该方式是通过给同一组件下的元素添加相同的自定义属性hash值才实现样式的私有化

    <div class="cutom_box" data-v-5hc9jk3pw>
      <p data-v-7eb2bc79>Hello World!</p>
    </div>
    
    .cutom_box[data-v-5hc9jk3pw] {
      width: 100%;
    }
    .cutom_box p[data-v-5hc9jk3pw] {
      color: #333;
      font-size: 12px;
    }
    

    CSS Module

    除了scoped之外,我们还可以使用css module的方式,通过在style标签上添加module属性来实现样式的私有化。
    该方式是直接将代码编译为CSS Modules

    /* 案例来自阮一峰老师的博文《CSS Modules 用法教程》 */
    /* https://www.ruanyifeng.com/blog/2016/06/css_modules.html */
    
    /* 编译前 */
    .title {
      color: red;
    }
    
    /* 编译后 */
    ._3zyde4l1yATCOkgn-DBWEL {
      color: red;
    }
    
    <template>
      <p :class="$style.customColor">Hello World!</p>
    </template>
    
    <style module>
    .customColor {
      color: #ff0000;
    }
    </style>
    

    注意:

    1. 单纯使用<style module>的时候,默认绑定到 style 对象上,所以需要通过style.customColor来引用,如果CSS类名是custom-color这样的,则需要通过 $style['custom-color'] 来引用。
    2. 也可以给style module添加一个命名,这样就可以通过 变量名来操作
    /* 命名的CSS Module */
    <template>
      <p :class="customModule.customColor">Hello World!</p>
    </template>
    
    <style module="customModule">
    .customColor {
      color: #ff0000;
    }
    </style>
    

    useCssModule

    vue3提供的Composition API - useCssModule,用来在setup函数或者<script setup></script>标签内访问CSS Module。(只可以在setup内使用)

    <template>
      <p :class="$style.customColor"></p>
    </template>
    
    <script setup lang="ts">
    import {  useCssModule } from 'vue'
    const styleModule = useCssModule()
    console.log('> styleModule:', styleModule)
    </script>
    
    <style module>
    .customColor {
      color: #ff0000;
    }
    </style>
    
    <template>
      <p :class="customModule.customColor"></p>
    </template>
    
    <script setup lang="ts">
    import {  useCssModule } from 'vue'
    //如果是命名过的CSS Module,则需要传入具体的module名称才能获取到
    const styleModule = useCssModule('customModule')
    console.log('> styleModule:', styleModule)
    </script>
    
    <style module="customModule">
    .customColor {
      color: #ff0000;
    }
    </style>
    

    使用CSS Module可以更精确的隔离组件的样式,避免样式污染。但大部分情况通过scoped基本可以实现样式隔离,所以根据项目需求实际情况来选择
    参考:阮一峰老师的CSS Module

    相关文章

      网友评论

          本文标题:vue3 Style Module实战

          本文链接:https://www.haomeiwen.com/subject/ofwridtx.html