最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vue scoped踩坑记录

    正文概述 掘金(葛坪里)   2021-01-05   528

    样式修改失败】前几天开发需求,遇到一个坑,我无论怎么修改样式都无法完成 对公司内部的一个基础组件样式进行修改。经过排查,因为我在style标签上加入了scoped属性,于是我需要对scoped这个属性进行研究。

    scoped作用

    让.vue中的样式不影响其他.vue组件中的样式。

    在vue组件中,为了使样式私有化(模块化),不对全局造成污染,在style标签上添加scoped属性,以表示它只属于当下的模块。

    vue scoped踩坑记录vue scoped踩坑记录

    如图所示,我添加了scoped属性,dom和 css选择器后面都会添加一个不重复的data属性,如图中的:data-v-f29e1056。

    所以,scoped属性会做以下两件事:

    • 给HTML的DOM节点增加一个不重复的data属性。
    • 在每句css选择器的末尾(编译后生成的css语句)加一个当前组件的data属性选择器,对样式进行私有化。

    于是我们会遇到两种情况:

    • 在不使用scoped的组件中加入了使用了scoped的组件。
    • 在使用了scoped属性的组件中加入了使用了scoped的组件。

    在 不使用 scoped的组件中引用带scoped属性的组件

    <template>
     <div class="son-warp">
      <son class="son">text</son>
     </div>
    </template>
    ...
    <style scoped>
     .son-warp{
      display:inline-block;
     }
     .son{
      padding: 5px 10px;
      font-size: 12px;
      border-raduis: 2px;
     }
    </style>
    

    vue scoped踩坑记录

    //father.vue
    <template>
     <div class="father">
      <p class="title"></p>
       
      <son></son>
     </div>
    </template>
    ...
    <style>
     .father{
      width: 200px;
      margin: 0 auto;
     }
     .father .son{
      border-raduis: 5px;
     }
    </style>
    

    vue scoped踩坑记录

    最后的结果会是:

    <div class="father">
     <p class="title"></p>
     <!-- son上面定义的组件 -->
     <div data-v-f29e1056 class="son-warp">
      <son data-v-f29e1056 class="son">text</son>
     </div>
    </div>
    /*son.vue渲染出来的css*/
    .son-warp[data-v-f29e1056]{
     display:inline-block;
    }
    .son[data-v-f29e1056]{
     padding: 5px 10px;
     font-size: 12px;
     border-radus: 2px;
    }
    /*father.vue渲染出来的css*/
    .father{
     width: 200px;
     margin: 0 auto;
    }
    .father.son{
     border-raduis: 5px;
    }
    

    vue scoped踩坑记录

    此时由于权重关系,我们只需要调整对应的权重就可以调出我们需要的样式。

    在 使用 scoped的组件中引用带scoped属性的组件

    在父组件的style标签加入scoped属性

    //father.vue
    <template>
     <div class="father">
      <p class="title"></p>
       
      <son></son>
     </div>
    </template>
    ...
    <style scoped>
     .father{
      width: 200px;
      margin: 0 auto;
     }
     .father .son{
      border-raduis: 5px;
     }
    </style>
    

    vue scoped踩坑记录

    浏览器渲染的结果是:

    <div data-v-57bc25a0 class="father">
     <p data-v-57bc25a0 class="title"></p>
     <!-- son是上面定义的组件 -->
     <div data-v-57bc25a0 data-v-f29e1056 class="son-warp">
      <son data-v-f29e1056 class="son">text</son>
     </div>
    </div>
    /*son.vue渲染出来的css*/
    .son-warp[data-v-f29e1056]{
     display:inline-block;
    }
    .son[data-v-f29e1056]{
     padding: 5px 10px;
     font-size: 12px;
     border-radus: 2px;
    }
    /*father.vue渲染出来的css*/
    .father[data-v-57bc25a0]{
     width: 200px;
     margin: 0 auto;
    }
    .father .son[data-v-57bc25a0]{
     border-raduis: 5px;
    }
    

    vue scoped踩坑记录

    于是我们可以发现一个问题就是.father .son末尾的标记是father的标记,找不到对应的dom节点,于是我们设置样式就失效了。

    vue scoped踩坑记录vue scoped踩坑记录

    解决方法

    1. 引入样式
    2. 再写一个不加scoped的style(最好同时用BEM css命名规范 等方式去限定style影响范围)

    起源地下载网 » vue scoped踩坑记录

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元