• vue组件样式scoped


    1.vue组件中的样式如果没加scrped,样式代表的是全局样式(避免组件之间样式的冲突)。加了属性代表是模块化的。

            

    其他组件引用button组件

    上面分析了单个组件渲染后的结果,那么组件互相调用之后会出现什么样的结果呢?,具体分两种情况:模块一般组件引用模块私有组件(本质和模块私有组件引用模块一般组件一样);模块私有组件引用模块私有组件。

    举个例子:在组件content.vue中使用了button组件,那么content.vue组件是否添加scoped属性渲染出来的结果有什么区别呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //content.vue
    <template>
      <div class="content">
        <p class="title"></p>
        <!-- v-button假设是上面定义的组件 -->
        <v-button></v-button>
      </div>
    </template>
    ...
    <style>
      .content{
         1200px;
        margin: 0 auto;
      }
      .content .button{
        border-raduis: 5px;
      }
    </style>

    模块一般组件(未添加scoped)引用模块私有组件

    如果style上没有加scoped属性,那么渲染出来html和css分别就是:

    1
    2
    3
    4
    5
    6
    7
    <div class="content">
      <p class="title"></p>
      <!-- v-button假设是上面定义的组件 -->
      <div data-v-2311c06a class="button-warp">
        <button data-v-2311c06a class="button">text</button>
      </div>
    </div>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /*button.vue渲染出来的css*/
    .button-warp[data-v-2311c06a]{
      display:inline-block;
    }
    .button[data-v-2311c06a]{
      padding: 5px 10px;
      font-size: 12px;
      border-radus: 2px;
    }
    /*content.vue渲染出来的css*/
    .content{
      width: 1200px;
      margin: 0 auto;
    }
    .content .button{
      border-raduis: 5px;
    }

    可以看出,虽然在content组件中,修改了button的border-raduis属性,但是由于权重关系,生效的依然是组件内部的样式(此时是外部的样式被覆盖)。所以如果要达到修改样式的目的,就必须加重我们要修改样式的权重(增加选择器层级,ID选择器,并列选择器,impotant等)

    模块私有组件(添加scoped)引用模块私有组件

    如果加了scoped属性呢?按照开始分析出来的规则(事实也是这么的):

    首先是在所有的DOM节点加上data属性

    然后在css选择器尾部加上data属性选择器

    那么渲染出来html和css分别就是:

    1
    2
    3
    4
    5
    6
    7
    <div data-v-57bc25a0 class="content">
      <p data-v-57bc25a0 class="title"></p>
      <!-- v-button假设是上面定义的组件 -->
      <div data-v-57bc25a0 data-v-2311c06a class="button-warp">
        <button data-v-2311c06a class="button">text</button>
      </div>
    </div>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /*button.vue渲染出来的css*/
    .button-warp[data-v-2311c06a]{
      display:inline-block;
    }
    .button[data-v-2311c06a]{
      padding: 5px 10px;
      font-size: 12px;
      border-radus: 2px;
    }
    /*content.vue渲染出来的css*/
    .content[data-v-57bc25a0]{
      width: 1200px;
      margin: 0 auto;
    }
    .content .button[data-v-57bc25a0]{
      border-raduis: 5px;
    }

    对于上面的两种情况,可以明显看出来渲染后的结果大不相同。

    虽然我们在content添加了想要修改button组件的样式的代码,但是仔细看,由于.content .button这句在末尾加的是content组件的scoped标记,最后这句其实根本作用不到我们想要的DOM节点上,所以这种情况我们在content内部写的任何样式都不会影响到button.vue组件,所以这就尴尬了。。。。

    当然这个问题也是可以解决的,就是直接加全局样式可以修改到,但这势必会影响全部地方的组件;所以需要另外一种方法在content.vue组件内再加一个不带scoped属性的style标签,也就意味着要加两个style,一个用于私有样式,一个用于共有样式。这肯定是有点shit的,并且这两种解决方案都回避不了一个问题:权重!!!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //content.vue
    <template>
      <div class="content">
        <p class="title"></p>
        <!-- v-button假设是上面定义的组件 -->
        <v-button></v-button>
      </div>
    </template>
    ...
    <style scoped>
      .content{
         1200px;
        margin: 0 auto;
      }
    </style>
    <style>
      .content .button{
        border-raduis: 5px;
      }
    </style>

    这样符合规范么?貌似没看到不能这么写,并且这么写也确实生效了。。。但这样确实增加了思维的复杂度,有点苦恼啊。

    2.

    总结一下scoped三条渲染规则

    1. 给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性
    2. 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式
    3. 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性
  • 相关阅读:
    WebDynpro ALV中标准按钮的事件问题
    WebDynpro 4A 中使用dropdownbykey
    day 09总结(数据类型分类、Python深浅拷贝、异常处理、基本文件处理、绝对路径和相对路径)
    Markdown基本语法
    day 06总结(while循环/for循环)
    day 04总结(数据类型/解压缩/用户交互)
    day 03总结(变量/变量内存管理/注释/执行Python的两种方式)
    day 01总结(计算机基础编程/组成/操作系统)
    day 07总结(数字类型内置方法/字符串类型内置方法)
    day 02总结(编程语言+软件安装)
  • 原文地址:https://www.cnblogs.com/huancheng/p/9120417.html
Copyright © 2020-2023  润新知