来自子组件的 Vue 3 插槽样式

Posted

技术标签:

【中文标题】来自子组件的 Vue 3 插槽样式【英文标题】:Vue 3 slot styles from child component 【发布时间】:2021-06-06 09:26:09 【问题描述】:

总结:我需要从子组件设置<slot> 的内容样式。我正在使用作用域 css 并且样式不适用:

我有以下两个组件:

<!-- Parent.vue -->
<template>
  <h1> msg  from Parent</h1>
  <Child>
    <h1> msg  from Child</h1>
  </Child>
</template>
...
<style scoped>
h1 
  color: green;

</style>

<!-- Child.vue -->
<template>
  <slot></slot>
</template>
...
<style scoped>
h1 
  color: red;

</style>

我希望第二个&lt;h1&gt; 是红色的,但它是绿色的,因为该组件是用类似的东西呈现的:

<h1 data-v-452d6c4c data-v-2dcc19c8-s>Hello from Child</h1>

<style>
h1[data-v-452d6c4c] 
  color: green;

h1[data-v-2dcc19c8] 
  color: red;

</style>

data-v-452d6c4c 来自 Parent,data-v-2dcc19c8-s 来自 Child

如果&lt;h1&gt; 标记中的第二个属性只是data-v-2dcc19c8,我想要的样式将被应用,但由于它有-s 后缀(插槽?),它没有。

我可能会找到一些其他的解决方案,比如类或其他东西,但我很少使用&lt;slot&gt;,我想了解内部工作原理。 -s 告诉我,我正在尝试做的事情可以在框架的帮助下处理,我错过了什么?

一个工作样本:

https://codesandbox.io/s/condescending-brown-ilfwn

【问题讨论】:

【参考方案1】:

在 Vue 3 中使用新的 ::v-slotted 选择器:

Child.vue

<template>
  <slot></slot>
</template>

<script>
export default 
  name: "Child",
;
</script>

<style scoped>
::v-slotted(h1) 
  color: red !important;

</style>

在 Vue 3 中,子 scoped 样式默认不会影响插槽内容。

在这种情况下,!important 修饰符是必要的,因为父级还定义了 h1 样式,否则将优先

【讨论】:

感谢您的回答,我一直在寻找一种在 Vue 中进行开槽样式的方法 文档中是否有关于此的页面?在文档中搜索 v-slotted 未显示任何结果

以上是关于来自子组件的 Vue 3 插槽样式的主要内容,如果未能解决你的问题,请参考以下文章

Vue 2 和 NuxtJS - 来自父级的样式子组件

vue slot插槽的使用

如何正确使用 vue js Web 组件内部的插槽并应用样式

Vue的作用域插槽

样式化 Vue 插槽

小程序开发—— 封装自定义弹窗组件