vue知识点小提问

146 阅读2分钟

样式标签中加入scoped,其中的原理是什么?以及样式穿透是什么?怎么解决样式优先级问题以及扩展类型

Scoped原理:它就是给各组件的样式添加了一个唯一标识,让他们自己管理自己的样式,互不打扰。避免造成互相渲染页面,这个唯一标识就是自定义属性,若你在样式当中,添加scoped,那么你运行界面,F12打开控制台,在它的样式中会显示一个唯一的标识,例如:data-v-xxx,给选择器添加了一个唯一标识,所以才能实现各组件样式的隔离。
扩展:
    若你想要在填有在scoped的组件中使用,其他的组件库时,那么该组件的style样式,优先级就会降低,有时候不会生效,这个时候需要使用样式穿透
    代码如下:
    <div class="demo">
        父组件
        <css-demo class="son"></css-demo>
    </div>
</template>
<script>
import cssDemo  from './components/cssDemo .vue'
export default {
  name: 'App',
  components: {
    cssDemo 
  }
}
</script>
<style scoped>
    .demo{
        width: 200px;
        padding: 10px;
        border: 1px solid rgba(0,0,0,1);
        color: #000;
    }
    .son{
        color: green;
    }
    .son .c2{
        color: green !important;
    }
    .c1 .c2{
        color: green !important;
    }
    .son.c1 .c2{
        color: green !important;
    }
</style>
    <div class="c1">
        子组件根元素(red)
        <div class="c2">
            子组件非根元素(blue)
        </div>
    </div>
</template>
<style scoped>
    .c1{
        border: 1px dashed #000;
        margin-top: 10px;
        padding: 5px;
        color: red;
    }
    .c1 .c2{
        border: 1px dotted #000;
        color:blue;
    }
</style>

这时候你就应该加上样式穿透

    <div class="demo">
        父组件
        <css-demo class="son"></css-demo>
    </div>
</template>
<script>
import cssDemo  from './components/cssDemo .vue'
export default {
  name: 'App',
  components: {
    cssDemo 
  }
}
</script>
<style scoped>
    .demo{
        width: 200px;
        padding: 10px;
        border: 1px solid rgba(0,0,0,1);
        color: #000;
    }
    .son{
        color: green;
    }
    .son .c2{
        color: green !important;
    }
    >>>.c1 .c2{
        color: green !important;
    }
    .son.c1 .c2{
        color: green !important;
    }
</style>

针对不同的样式类型(css,less,scss)有不同的样式穿透方法

css使用>>>
less使用/deep/
scss使用::v-deep

代码例子:

<style scoped>
    >>> .c1 .c2{
        color: green !important;
    }
</style>
<style scoped lang="less">
    /deep/ .c1 .c2{
        color: green !important;
    }
</style>
<style scoped lang=”scss“>
    ::v-deep .c1 .c2{
        color: green !important;
    }
</style>

v-for与v-if为什么不能一起使用?

1.vue2中v-for的优先级比v-if高,一起使用会造成性能的浪费
    解决方法有两种:把v-if放在v-for的外层或者把需要v-for的属性先从计算属性中过滤一次
2.v-if和v-for的优先级问题在Vue3中不需要考虑,vue3更新了v-if和v-for的优先级,使v-if的优先级高于v-for

nextTick

 在下次DOM更新循环结束之后执行延迟回调函数,由于vue中的DOM更新是异步操作的,也即是说修改数据变化的时候,它不会立即更新,而是会监听数据变化并缓存在同一事件当中,等同一数据循环当中,等同一数据循环中的所有数据变化完成之后,在统一进行试图更新,经常我们会在DOM还没更新的时候,就使用某一个元素,这样是获取不到变更之后的DOM的,为了能够得到更新后的DOM就设置了nextTick的方法,在修改数据之后,立即获取更新之后的DOM,一般用在Created钩子函数中又或者是,数据发生变化,想要执行变化的DOM的操作,可以使用nextTick
 例子:轮播图:只有页面结构完整才能实现轮播效果,所以在遍历轮播图中,它是一个动态页面,这时就应该使用nextTick回调函数,结构已经完整了,这时就可以遍历轮播图了。