带有 vaadin 和带有 svelte 的汇总的 Web 组件:主按钮忽略主题属性

Web components with vaadin and rollup with svelte: Primary button ignores theme attribute

也许有人以前试过这个并且能够给我提示。 我使用了普通的 svelte 设置(在主页中提到)来构建应用程序;

npx degit sveltejs/template my-svelte-project

我想在 Svelte 中使用 vaadin 网络组件。我已经安装了它;

npm install @vaadin/vaadin

main.ts的代码:

<script lang="ts">
    import '@vaadin/button/theme/material'

</script>

<main>
    <vaadin-button theme="primary">Primary</vaadin-button>
    <vaadin-button theme="secondary">Sec</vaadin-button>
</main>

<style>
    main {
        text-align: center;
        padding: 1em;
        max-width: 240px;
        margin: 0 auto;
    }

    @media (min-width: 640px) {
        main {
            max-width: none;
        }
    }
</style>

关键是它几乎可以工作 :) 按钮有样式,我可以点击它们但是...主题被忽略了;

主要的背景颜色应如文档中所述; https://vaadin.com/docs/latest/ds/components/button/#styles

有什么想法吗???

您似乎正在导入 Button 组件的 Material 主题版本。 “主要”主题变体仅在您使用默认 Lumo 主题时可用。要导入它,请使用 import '@vaadin/button';

对于 Material 主题,您可以改用“outlined”和“contained”主题变体:https://cdn.vaadin.com/vaadin-material-styles/1.3.2/demo/buttons.html

发生这种情况是因为 Svelte 如何在自定义元素上设置数据。如果 属性 存在于与您设置的属性同名的元素上,Svelte 将设置 属性 而不是属性。否则,它将回退到属性。所以,下面...

<vaadin-button theme="primary">Primary</vaadin-button>

...被编译成类似的东西:

button.theme = "primary";

通常这很有效,尤其是在设置数组和对象属性时。但是,vaadin-button 样式需要设置 theme 属性 ,而不是 属性。因为 Svelte 设置了 属性,所以样式不适用。

:host([theme~="primary"]) {
  background-color: var(--_lumo-button-primary-background-color, var(--lumo-primary-color));
  color: var(--_lumo-button-primary-color, var(--lumo-primary-contrast-color));
  font-weight: 600;
  min-width: calc(var(--lumo-button-size) * 2.5);
}

我认为这是一个 Vaadin 错误 - 如果您为同一数据公开一个属性和一个 属性,那么消费者设置哪一个都无关紧要。设置 属性 应该与设置属性具有相同的效果。解决此问题的一种快速方法是 vaadin-button 反映主题 属性,以便设置 theme 也设置属性。以下是 Lit.

中的操作方法

但是,该更改需要组件库作者来实现。作为库的使用者,您还可以在 Svelte 中解决此问题,方法是使用 action 强制 Svelte 设置属性。

<script>
  import "@vaadin/button";

  function setAttributes(node, attributes) {
    for (const [attr, value] of Object.entries(attributes))
      node.setAttribute(attr, value);
  }
</script>

<main>
  <vaadin-button use:setAttributes={{ theme: "primary" }}>Primary</vaadin-button>
  <vaadin-button>Normal</vaadin-button>
</main>

如果您需要更多 in-depth 解释,我在 CSS-Tricks 上写了一篇关于此行为和其他解决方法的文章。