【发布时间】:2021-06-06 03:30:57
【问题描述】:
组件 B 包含在组件 A 的 slot html 中。下面的代码无法正常工作,因为默认情况下组件不共享样式(svelte-${hash(css)} 用于在编译过程中创建一组不同的“虚拟”命名空间):
// Component A - ./Menu.svelte
<Router>
<ul class="menu">
<Delimiter label={$format('Menu label')}></Delimiter>
{#each routes as route}
{#if route.url?.length > 0}
<li class="menu-item">
<Link to={route.url} getProps={onLinkUpdate}>
{route.title}
</Link>
</li>
{/if}
{/each}
</ul>
</Router>
// Component B - ./Menu/Delimiter.svelte
<li class="divider" data-content={label} {...$$restProps} />
此处的路由器和链接是单独包的一部分(因此,将其视为命名空间 A)。 Delimiter 是项目级别的组件(命名空间 B)。它们都使用相同的样式表,即相同的 CSS 框架环境。
上面的一个例子被编译成这样的:
<ul class="menu">
<li class="divider" data-content="..."></li>
<li class="menu-item">...</li>
</ul>
而 li 和 divider 类没有收到它的样式。但是如果 Delimiter 组件(这一行):
<Delimiter label={$format('Menu label')}></Delimiter>
将替换为其直接内容:
<li class="divider" data-content="..."></li>
编译后的源码如下:
<li class="divider svelte-sipu9k" data-content="..."></li>
所以,问题是 - 如何正确地与包含(嵌套)到原始命名空间的外部组件“共享”样式库? (或者是架构问题,我应该尝试不同的方法?)
【问题讨论】:
-
你的 CSS 来自哪里?如果它来自外部样式表并且您的组件没有被样式化,那么就有问题了。但是您描述的场景是父组件在其中定义了一些样式,并且您希望它们级联到嵌套组件。
-
父组件包含一个 .scss 文件:
<style src="./Menu.scss"></style>,该文件描述了.divider类的样式,没有任何 :global(或类似)指令。只是来自框架代码库的@import。
标签: svelte