sja*_*rni 6 sass vue.js vue-sfc dart-sass
我正在尝试将一些 Vue.js 单文件组件从::v-deep
语法迁移到:deep()
,如此处所述。但是,我不确定如何使其与嵌套SCSS 规则一起使用&__*
。没有工作的规则&__*
也很好。
我们使用的 SCSS 编译器是dart-sass。
例如,有这个原始片段:
::v-deep .wrapper {
display: flex;
&__element {
display: block
}
}
Run Code Online (Sandbox Code Playgroud)
正确地将代码编译为
[data-v-S0m3Ha5h] .wrapper__element {
display: block;
}
Run Code Online (Sandbox Code Playgroud)
并抛出警告:[@vue/compiler-sfc] ::v-deep usage as a combinator has been deprecated. Use :deep(<inner-selector>) instead.
:deep()
在顶层规则中我尝试将其转换为:deep()
这样:
:deep(.wrapper) {
display: flex;
&__element {
display: block
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致编译器错误,因为:deep(wrapper)__element
不是有效的选择器。
:deep()
在嵌套规则中所以我将 移至:deep
嵌套规则:
.wrapper {
display: flex;
:deep(&__element) {
display: block
}
}
Run Code Online (Sandbox Code Playgroud)
编译没有错误,但产生了拙劣的 css:
.wrapper[data-v-S0m3Ha5h] &__element {/* ... */}
Run Code Online (Sandbox Code Playgroud)
如何使用嵌套&__*
规则:deep()
?
:deep
由于您提到的原因,Sass 显然不允许嵌套(或任何其他伪类)的选择器参数列表,但有一些解决方法。
拆分样式,以便:deep
选择器列表不嵌套:
<!-- MyParent.vue -->
<style scoped lang="scss">
:deep(.wrapper) {
display: flex;
}
:deep(.wrapper__element) {
display: block;
}
</style>
Run Code Online (Sandbox Code Playgroud)
分解 BEM 类名(从wrapper__element
到__element
),以便不需要父选择器:
<!-- MyComponent.vue -->
<template>
<div class="wrapper">
<div class="__element">...</div>
</div>
</template>
Run Code Online (Sandbox Code Playgroud)
或增加wrapper__element
一个额外的__element
类(如果你可以忽略重复):
<!-- MyComponent.vue -->
<template>
<div class="wrapper">
<div class="wrapper__element __element">...</div>
</div>
</template>
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这种情况需要:deep
基于选择器(例如,root
在下面的示例中):
<!-- MyParent.vue -->
<template>
<div class="root">
<MyComponent />
</div>
</template>
<style scoped lang="scss">
.root:deep(.wrapper) {
display: flex;
.__element {
display: block;
}
}
</style>
Run Code Online (Sandbox Code Playgroud)
<!-- MyComponent.vue -->
<template>
<div class="wrapper">
<h1>.wrapper</h1>
<!-- Add __element class here (and optionally remove wrapper__element) -->
<div class="wrapper__element __element">
<h1>.wrapper__element</h1>
</div>
</div>
</template>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1072 次 |
最近记录: |