【问题标题】:How to create and style svelte 3 custom elements with nested components?如何使用嵌套组件创建和样式化 3 个自定义元素?
【发布时间】:2020-01-08 03:44:12
【问题描述】:

我正在尝试在 svelte 3 中创建 custom-element(Web 组件)。我找不到任何方法来设置 CSS 中嵌套组件的样式。 Svelte 在将样式注入到 ShadowDOM 内部的 <style> 之前会移除样式。

问题是我想在我的根元素中有嵌套组件。 例如:

  • RootComponent(细长的自定义元素)
    • (导入)FooComponent
    • (导入)BarComponent

如此处所述:svelte-custom-element

导入到自定义元素的所有组件都必须将编译器选项设置为<svelte:options tag="component-name" />

使用此选项设置嵌套组件按预期工作并注入到根的元素 ShadowDOM。问题是嵌套组件中定义的styles 没有被注入。 此问题的解决方法是将它们作为 ShadowDom 中的全局样式注入到根元素 <style> 中。 (Un) 幸运的是,当自定义元素尚不存在时,svelte 会在编译期间自动删除所有未使用的样式。

我的目标是使用 svelte 创建 Web 组件,然后在 svelte 之外将其用作本机 Web 组件。

这里是REPL

Conduitry 写道:

REPL 中的编译器选项实际上不会影响运行的代码,只会影响显示的代码。因此启用 customElement >并不意味着您正在构建和运行 Web 组件

所以它更像是一个代码示例而不是一个工作示例。

  1. 我想知道是否有另一种方法可以创建具有嵌套组件和适当样式的细长自定义元素。
  2. 有没有办法禁止删除未使用的 css?

https://imgur.com/a/zZia566

from <div class="nested"> 启动从 Nested.svelte 导入的嵌套组件。

<style> 元素应该有 .nested 类注入,但它被 svelte 编译器删除。

【问题讨论】:

    标签: web-component shadow-dom custom-element svelte svelte-component


    【解决方案1】:

    这是因为当customElement选项打开时,组件中的每个样式都会被注入到自定义元素的shadowRoot中。

    class YourComponent extends SvelteElement {
            constructor(options) {
                super();
    
                this.shadowRoot.innerHTML = `<style>.foo{color:red;}</style>`;
    // continues
    

    因此,为了让style出现,你必须使用svelte组件作为自定义元素,而不是作为svelte组件。

    您的App.svelte 应如下所示。

    <script>
        import Foo from './Foo.svelte'
        import Bar from './Bar.svelte'
    </script>
    <svelte:options tag="web-component" />
    
    <foo-component/>
    <bar-component/>
    

    但是,这并不能解决与自定义元素相关的问题。

    1. :全局选择器没有转化为实际的全局选择器。

    2. 每个嵌套组件都会生成shadowRoot,而大多数情况下您只需要顶级组件。

    从与自定义元素相关的 svelte 存储库中查看以下一些问题。

    svelte 似乎还没有完全支持自定义元素中的样式级联,应该在以后处理。

    在 svelte v3.12.1 中签入。

    【讨论】:

      【解决方案2】:

      感谢brunoalano 给我发送这个:svelte-custom-element-template。它解决了自定义构建脚本的样式问题。

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 2020-09-22
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        相关资源
        最近更新 更多