视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何修改Vue.js中scoped模式下的子组件内部标签样式
2020-11-27 19:56:50 责编:小采
文档
 本篇文章给大家分享的是如何修改Vue.js中scoped模式下的子组件内部标签样式 ,内容挺不错的,希望可以帮助到有需要的朋友

在Vue.js项目中,我们通常会在<style>标签上加上scoped属性,来为我们的组件生成一个唯一属性,如下面的代码:

my-comp.vue

<template>
 <p class="my-comp">
 <span>my comp</span>
 </p>
</template>

<script>
 export default {
 }
</script>

<style scoped>
</style>

生成后的html如下,可以看到p以及所有子标签上都有一个data-v-0a679ea0标识属性,这个属性就是我们在<style>上加上scoped的结果,如果你不加scoped,是不会生成这个标识属性的。

这个标识属性给我们带来一个好处是,组件内的样式不会影响到其他组件的标签,试想一下,如果我在my-comp组件中写了如下样式:

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

这个样式是一个非常通用的样式,如果其他组件中也有span标签,那就会应用到这个标签上了,加了scoped之后,最终生成的样式是这样的:

<style scoped>
 span { color: red; }
</style>
//生成后如下
<style>
 span[data-v-0a679ea0] {
 color: red;
 }
</style>

span[data-v-0a679ea0]这个样式只会应用到自己组件的span上,因为标识属性是组件唯一的。

如果我们把组件A放到组件B里面,看看这个标识属性是如何生成的。

home.vue

<template>
 <p class="home">
 <my-compo></my-compo>
 </p>
</template>

<script>
 import MyCompo from './my-comp'
 export default {
 components: {MyCompo}
 }
</script>

<style scoped>
</style>

生成的html代码如下:


data-v-957c7522是home组件的标识属性,这个属性也被添加到了my-comp组件的根上,但注意my-comp的span标签没有添加data-v-957c7522标识属性,因为这个span是my-comp组件内部的标签,并没有显示的在home组件中编写。

但有时候会出现需要在home组件写样式来修改my-comp内的标签这样的情况。

看下面代码:

这段代码是属于home组件的

<style scoped>
 .my-comp span {
 color: blue;
 }
</style>

但这段代码是不会改变<span>my comp</span>的颜色的,因为这段样式最终生成的样子是这样的:


my-comp的span标签并没有data-v-957c9522这个标识属性。

如何解决这个问题?

我们可以把home组件的scoped去掉就解决了,但这是不推荐的做法,上面已经说了,没有scoped的样式很容易影响其他组件,这种错误是非常难排查的。

如果你使用less这种样式语言,那么有个非常好的解决方案,看下面代码:

<style lang="less" scoped>
 @deep: ~'>>>';
 .my-comp @{deep} span {
 color: blue;
 }
</style>

我们再看最后生成的样式是怎么样的。


标识属性从span移到了.my-comp上了,这样这段样式就很好的应用到了my-comp组件的内部span标签,并且不会影响到其他组件。

下载本文
显示全文
专题