我正在try 将一些Vue.js Single File组件从::v-deep语法迁移到:deep(),如here所述.然而,我不确定如何让它与nested&__* SCSS规则一起工作.没有&__*的规则运行得很好.

我们使用的SCSS编译器是dart-sass.

Example

例如,拥有以下原始代码段:

::v-deep .wrapper {
    display: flex;

    &__element {
        display: block
    }
}

将代码正确编译为

[data-v-S0m3Ha5h] .wrapper__element {
    display: block;
}

并抛出一个警告:[@vue/compiler-sfc] ::v-deep usage as a combinator has been deprecated. Use :deep(<inner-selector>) instead.

:deep() in top-level rule

我try 将其转换为:deep(),如下所示:

:deep(.wrapper) {
    display: flex;

    &__element {
        display: block
    }
}

这会导致编译器错误,因为:deep(wrapper)__element is not a valid selector.

:deep() in the nested rule

所以我把:deep移到了嵌套规则中:

.wrapper {
    display: flex;

    :deep(&__element) {
        display: block
    }
}

它编译时没有错误,但生成的是拙劣的css:

.wrapper[data-v-S0m3Ha5h] &__label {/* ... */}

Question

如何使用嵌套的&__*条规则和:deep()条规则?

推荐答案

由于您提到的原因,Sass显然不允许嵌套 Select 器参数列表:deep(或任何其他伪类),但有几个解决方法.

解决方法1:拆分SASS样式

拆分样式,以使:deep的 Select 器列表不嵌套:

<!-- MyParent.vue -->
<style scoped lang="scss">
:deep(.wrapper) {
    display: flex;
}
:deep(.wrapper__element) {
    display: block;
}
</style>

demo 1

解决方法2:拆分类名

拆分BEM类名称(从wrapper__element__element),这样就不需要父 Select 器:

<!-- MyComponent.vue -->
<template>
    <div class="wrapper">
        <div class="__element">...</div>
    </div>
</template>

或者在wrapper__element的基础上增加一个__element类(如果可以忽略重复的话):

<!-- MyComponent.vue -->
<template>
    <div class="wrapper">
        <div class="wrapper__element __element">...</div>
    </div>
</template>

出于某种原因,此场景需要基于 Select 符的:deepto(例如,下例中的root):

<!-- MyParent.vue -->
<template>
    <div class="root">
        <MyComponent />
    </div>
</template>

<style scoped lang="scss">
.root:deep(.wrapper) {
    display: flex;

    .__element {
        display: block;
    }
}
</style>
<!-- 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>

demo 2

Vue.js相关问答推荐

Vue CDN的html工作,但v—如果不工作

将 html 文件移出 dist vite 中的 src 文件夹

如何只提取一次用于无线电组过滤的数据,而不是针对数据库中的每个条目提取数据?

是否可以将 nuxt3 与类星体框架一起使用

组合 API | Vue 路由参数没有被监视

将props传递给设置时的VueJS 3组合API和TypeScript类型问题:类型上不存在属性 user用户

如何使用 v-on:change 将输入文本传递给我的 vue 方法?

Vue.js 中有没有类似Jquery $(document).ready的功能?

Object.assign 没有正确复制

Webpack 你可能需要一个合适的加载器来处理这个文件类型

命名空间模块身份验证的重复命名空间身份验证

Axios-一次发出多个请求(vue.js)

如何告诉 Vue 应用使用 Firebase 模拟器?

将 Vuetify 从 1.5 升级到 2 时,Sass-loader 错误 'options has an unknown property 'indentedSyntax''

克隆元素并附加到 DOM 的正确方法

偶数行格式化

mount() 仅在组件 Vue.js 上运行一次

使用 CloudFront 部署在 S3 上的 VueJS 应用程序的指定的密钥不存在

在 Vuex 模块中进行继承的方法

这个业务逻辑有多少属于 Vuex?