ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Vue.js 中使用 /deep/ 或 >>> 或 ::v-deep?

因此,我已阅读 here,在 Vue.js 中,您可以在选择器中使用 /deep/>>> 来创建适用于子组件内部元素的样式规则。但是,尝试在我的样式中使用它,无论是在 SCSS 中还是在普通的旧 CSS 中,都行不通。相反,它们被逐字发送到浏览器,因此没有效果。例如:

家.vue:

<style lang="css" scoped>
.autocomplete >>> .autocomplete-input 
{
// ...
}
</style>

生成的CSS:

<style type="text/css">
.autocomplete >>> .autocomplete-input[data-v-2bda0c9a]
{
//...
}
</style>

我想要的是:

<style type="text/css">
.autocomplete[data-v-2bda0c9a] .autocomplete-input
{
//...
}
</style>

我与 vue-loader 相关的 webpack 配置如下所示:

// ...
{
    test: /\.vue$/,
    loader: "vue-loader",
    options: {
        loaders: {
            scss: "vue-style-loader!css-loader!sass-loader"
        }
    }
}
// ...

所以我的问题是,如何让这个 >>> 运算符工作?

我已经找到 this 答案,但我正在这样做,但它不起作用......

@connexo Vue 加载器本身支持 CSS 的 scoped 修饰符,它与已失效的 native-to-CSS scoped 修饰符无关。
@connexo @RoyJ 删除 scoped 属性和 >>> 运算符确实使样式规则起作用,但它不是最佳的。正如 Roy J 所指出的,这个 scoped 属性与 W3C 无关。
你得到这个工作了吗?使用 <style scoped>>>> 应该可以工作 (.autocomplete >>> .autocomplete-input),如果使用 <style lang="scss" scoped>/deep/ 应该可以工作 (.autocomplete /deep/ .autocomplete-input)(使用 nuxt 1.4 / vue 2.5 测试)
deep-selectors 这应该很有用

D
Dan

Vue 2

以下内容也适用于 Vue 3,但已弃用。

Sass:   使用 ::v-deep

::v-deep .child-class {
    background-color: #000;
}

使用 Sass:   使用 >>>

>>> .child-class {
    background-color: #000;
}

无论使用哪种语法,此组件的 <style> 标记都必须是 scoped

<style scoped>

Vue 3(2022 年 7 月 14 日更新)

在 Vue 3 中,::v- 前缀现在是 deprecated,我们不再需要 >>>。我们可以使用统一的 :deep 选择器无论是否使用 Sass,但现在建议在选择器中使用括号。

使用:deep(.child-class)

:deep(.child-class) {
    background-color: #000;
}

这也适用于 Vue 2.7(最终的 Vue 2 版本)

Vue 3 新的选择器

此外,在 Vue 3 中,有一个 new feature 用于带有 <slot> 的组件,它可以对传递的插槽内容进行样式设置。

老虎机内容   使用:slotted(.child-class)

:slotted(.slot-class) {
    background-color: #000;
}

最后,在 Vue 3 中,有一个 new feature 来注册全局样式,即使是来自 scoped 组件:

全局样式   使用:global(.my-class)

:global(.my-class) {
    background-color: #000;
}

对于任何语法,此组件的 <style> 标记必须是 scoped

<style scoped>

概括

在 Vue 2 中:

/deep/ 语法已弃用

在 Sass 中使用 ::v-deep,在没有 Sass 的情况下使用 >>>

在 Vue 3 中:

::v-deep .child-class 已弃用,取而代之的是 :deep(.child-class)

::v- 前缀已弃用,取而代之的是:

>>> 语法已弃用

/deep/ 语法已弃用

有新的 :slotted 和 :global 选择器

对于每个版本/语法,此组件的 <style> 标记必须是 scoped

<style scoped>

FWIW,Vue 2.7 现在似乎也推荐 :deep(.child-class) 而不是 ::v-deep .child-class
@PedroLamas 谢谢,你能链接到你在哪里看到这个吗?我在发行说明中没有看到它
当我将我的项目 (Fluidd) Vue 版本从 2.6.x 更改为 2.7.x 时,我亲身经历过,并且在运行它时开始显示有关该更改的警告!
@PedroLamas - 我在提到它的地方记下了这个事实。如果他们更新 Vue 2 文档说这是推荐的,那么也许我可以再次更改它。
S
Satyam Pathak

避免使用 /deep/ 而是使用 ::v-deep

使用 deep selector 可以更改任何范围的 component's css,但很快 /deep/ 将被弃用

Vue Github 参考 - https://github.com/vuejs/vue-loader/issues/913

在这种情况下使用 ::v-deep,并避免弃用 /deep/

参考 - Deep Selector

只需在 chrome 或任何浏览器控制台中使用 devtools 检查您要修改的呈现 element 的类。

然后,在您使用 component 时,修改它

<style scoped>
::v-deep .custom-component-class {
   background: red; //
}
</style>

我还刚刚发现 /deep/ 使用 Babel 7 破坏了构建,因此在 Sass 中 ::v-deep 成为唯一的选择
a
arapl3y

我已经成功地在 Vue 的作用域 SCSS 样式表中使用了 /deep/ 并具有以下结构:

.parent-class {
  & /deep/ .child-class {
    background-color: #000;
  }
}

编辑: /deep/ 已被弃用,如果它不再适合您,请参阅解释 ::v-deep 的其他答案


请检查其他答案“/deep/”已被弃用!
B
Brian Scramlin

虽然在 Documentation 中没有找到,但答案是您尝试访问的组件不能是根组件。将您的单个组件包装在 <div> 中,它应该可以在作用域 scss 上使用 ::v-deep 工作,正如其他人所解释的那样。


K
Kristiyan Tsvetanov

对我来说,唯一有效的是

<style scoped>.  // sass and scss didn't work
  >>> .deep-selector {
    ...
  }
</style>

我同意:这是一个很好的简短答案,适用于所有用例。它也是 vue-loader 文档中目前唯一提到的一个。
و
وحید فریادرس

::v-deep 用作组合器已被弃用。使用 :deep() 代替。

:deep(.child-class) {
    background-color: #000;
}

如何将它与多个类一起使用?
吴张明

我通过添加解决了这个问题

options: { styleIsolation: 'shared' }, // 添加这个方法: { yourFunc1 () { } } .pet-info{ ::v-deep .title { width: 51px !important;背景颜色:红色!重要 } }

像方法一样在组件中配置这个,和方法一样是同级的。


它适用于 uniapp / mpvue(微信小程序)项目。这个配置在 vueJs 中不存在

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅