我有一个现有的Astro组件,它的模板中已经包含了一些类;然而,我试图在另一个视图中重用此组件,并仅在该视图中更改其标头的颜色。
所以我读了一些文档,说我可以传递一个class
道具,将类从父级添加到子级;然而,我不明白如何将现有类保留在组件中,然后重写某些内容或在现有类的基础上添加另一个类。
<ExpansionQuestion question={question.question}>
<Fragment slot="body" set:html={question.answer} />
</ExpansionQuestion>
ExpansionQuestion
根元素:
<details
class="group bg-blue-gray duration-300 rounded-lg p-4 w-full shadow-md focus:outline-none focus:ring-0"
>
我只想在一个特定视图的details
元素中添加一个不同的bg-secondary
类,其余类在任何地方都应该保持不变。
有可能做到这一点吗?
这里的一个好方法是使用Astro的class:list
指令。这样可以更容易地组合各种类。
在您的示例中,您可能会执行以下操作:
-
将附加类传递给您使用它的组件(这里使用
bg
道具,但您可以将其用于任何情况):<ExpansionQuestion question={question.question} bg="bg-secondary"> <Fragment slot="body" set:html={question.answer} /> </ExpansionQuestion>
-
使用道具控制
ExpansionQuestion.astro
组件中的背景:--- const { bg } = Astro.props; --- <details class:list={[ "group duration-300 rounded-lg p-4 w-full", "shadow-md focus:outline-none focus:ring-0", bg || "bg-blue-gray" ]} >
Astro将自动组合
class:list
数组中的项目,在这种情况下,如果传递了bg
道具,则将使用该道具,但如果没有传递道具,则默认为蓝灰色。
接受子组件中的class
道具并将其应用于根元素。析构函数时,必须重命名它,因为class
是JavaScript中的保留字。
子组件:
---
const { class: className } = Astro.props
---
<div class:list={['child-component', className]}>
Child component
</div>
<style>
.child-component {
border: 2px solid blue;
}
</style>
从父级使用:
---
import ChildComponent from '...'
---
<div class="parent">
<ChildComponent class="my-child-component"/>
</div>
<style>
.my-child-component {
background: red;
}
</style>
更多关于文档