zoukankan      html  css  js  c++  java
  • vue组件样式覆盖问题-module

    例如你写个组件,组件根dom上有个类名控制组件高度是300px,即组件默认的高度是300px;

    用的时候你给这个组件上价格类名控制组件高度是150px;

    这种情况下渲染结果为:

    可以看出调用者写的样式竟然覆盖不了组件自身的默认样式,这肯定是不科学的。

    那怎么办呢?

    解决的思路肯定是增加调用者的权重,可以给height加上!importent; 肯定是能解决问题的 , 但费半天劲只为了写这个!importent肯定会被看官骂,那会有更好的解决方法吗?

    那是必须的 

    那就是用module去替代scoped:这样做的好处是编译渲染之后class类名不会加上属性名选择器增加权重,就能显示调用者的样式了。

    修改如下:

    <template>
      <div :class="$style.root"></div>
    </template>
    
    <script>
    export default {
      data() {
        //这里存放数据
        return {};
      }
    };
    </script>
    <style module>
    .root {
      height: 300px;
      background-color: #aabbcc;
    }
    </style>

    用法不用变,渲染结果如下:

    就覆盖不了调用者的样式了 ,完美!

    vue官方是这样说的:

    CSS Modules 是一个流行的,用于模块化和组合 CSS 的系统。vue-loader 提供了与 CSS Modules 的一流集成,可以作为模拟 scoped CSS 的替代方案。
     
    用法:
    1.在style标签中用module替换scoped
    2.样式表用$style注入
    3.注入时候也支持vue的对象/数组语法
      
    <template>
      <div :class="{[$style.root]:true,[$style.mt8]:isMt}"></div>
      <!-- <div :class="$style.root"></div> -->
    </template>
    
    <script>
    export default {
      data() {
        //这里存放数据
        return {
          isMt:true
        };
      }
    };
    </script>
    <style module>
    .root {
      height: 300px;
      background-color: #aabbcc;
    }
    .mt8{
      margin-top: 8px;
    }
    </style>

    4.style不用整

    你也可以通过 JavaScript 访问到它:

    let mt8 = this.$style.mt8;

    注意:vue loader 上说:首先,CSS Modules 必须通过向 css-loader 传入 modules: true 来开启,但是我没有整也可以了

    参考文档(vue loader文档):https://vue-loader.vuejs.org/zh/guide/css-modules.html#%E7%94%A8%E6%B3%95

     over!

  • 相关阅读:
    C# 调用Java Webservice 加入SoapHeader 验证信息
    SqlServer查找表中多余的重复记录
    INI文件的读写
    Sql触发器脚本
    Sql遍历更新脚本
    CAS 单点登录,通过ticket 获取登录用户
    模块 | 验证格式
    aja如何解决跨域请求?
    说说各个浏览器box模型
    Vue 双向数据绑定原理分析
  • 原文地址:https://www.cnblogs.com/rainbowLover/p/13087760.html
Copyright © 2011-2022 走看看