不要依赖默认属性值来设置 Web 组件的样式

wufei123 2025-01-26 阅读:5 评论:0
别误会我的意思,我并不反对 web 组件 api 的默认值。我对他们的问题是他们不可靠。 问题 为 api 提供可用选项列表的常见方法是使用 typescript 的 untion 类型。 /** the dis...

别误会我的意思,我并不反对 web 组件 api 的默认值。我对他们的问题是他们不可靠。

问题

为 api 提供可用选项列表的常见方法是使用 typescript 的 untion 类型。

/** the display variant for the button */
@property({reflect: true})
variant: 'default' | 'solid' | 'ghost' = 'default';

这里有一些基本的 css 来使这些变体发挥作用。

:host {
  --accent-color: #0265dc;
}

button {
  cursor: pointer;
  padding: 0.5rem;
}

:host([variant='default']) button {
  border: solid 1px var(--accent-color);
  background-color: white;
  color: var(--accent-color);
}

:host([variant='solid']) button {
  border: solid 1px var(--accent-color);
  background-color: var(--accent-color);
  color: white;
}

:host([variant='ghost']) button {
  border: solid 1px transparent;
  background-color: transparent;
  color: var(--accent-color);
}
注意:代码示例使用 lit,但这里讨论的原理可以轻松应用于其他库和框架。

挑战是自定义元素/web 组件可以在任何地方使用。它们可以以字符串、服务器端语言(如 php)插入到 dom 中,可以在 javascript 的 createelement 函数中创建,甚至可以在标准 html 中创建。我的意思是,并不总是有一种“类型安全”的方法来确保准确设置自定义元素属性。因此,我们组件库的 pr 清单中的一项是:

✅ 属性和属性在设置、取消设置和设置不当时都有效。

测试我们的 api

根据这些准则,让我们测试上面的 api 设置。

  • 设置 - 一切看起来都很好。
<my-button variant="default">default button</my-button>
<my-button variant="solid">solid button</my-button>
<my-button variant="ghost">my button</my-button>

不要依赖默认属性值来设置 Web 组件的样式

  • 未设置
    • 没有设置属性,它可以正常工作,因为我们有一个默认值,并且它被配置为在设置时反映元素上的属性。
    • 如果我们将变量属性设置为未定义,则会破坏样式。
<!-- no attribute set -->
<my-button>no attribute button</my-button>

<!-- jsx example -->
<my-button variant={undefined}>unset button</my-button>

不要依赖默认属性值来设置 Web 组件的样式

  • 设置不当 - 当我们将变体属性设置为“垃圾”时,它也会崩溃。
<my-button variant="rubbish">rubbish button</my-button>

不要依赖默认属性值来设置 Web 组件的样式

您可以在这里测试这个示例:

不要依赖默认属性值来设置 Web 组件的样式

修复 api

解决此问题的最简单方法是使按钮元素样式与默认样式匹配。

button {
  border: solid 1px var(--accent-color);
  background-color: white;
  color: var(--accent-color);
  cursor: pointer;
  padding: 0.5rem;
}

现在我们可以删除默认变体的代码。

/* we can remove this */
:host([variant='default']) button {
  border: solid 1px var(--accent-color);
  background-color: white;
  color: var(--accent-color);
}

为了避免混淆,您可以留下样式并添加评论。

/* styles for this variant are under the `button` element */
:host([variant='default']) { }

我们还可以更新 typescript api,使其成为可选并删除默认值。

/** The display variant for the button */
@property({ reflect: true })
variant?: 'default' | 'solid' | 'ghost';

现在,如果值已设置、未设置或设置不当,元素的行为将保持一致!

不要依赖默认属性值来设置 Web 组件的样式

您可以在此处查看最终代码:

不要依赖默认属性值来设置 Web 组件的样式

结论

通过删除对默认值的依赖,您可以创建更具弹性的 web 组件 api。如果您的组件必须具有默认值才能正常运行,请务必查看本文以创建一致工作的 web 组件。

以上就是不要依赖默认属性值来设置 Web 组件的样式的详细内容,更多请关注知识资源分享宝库其它相关文章!

版权声明

本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • 华为 Mate 70 性能重回第一梯队 iPhone 16 最后一块遮羞布被掀

    华为 Mate 70 性能重回第一梯队 iPhone 16 最后一块遮羞布被掀
    华为 mate 70 或将首发麒麟新款处理器,并将此前有博主爆料其性能跑分将突破110万,这意味着 mate 70 性能将重新夺回第一梯队。也因此,苹果 iphone 16 唯一能有一战之力的性能,也要被 mate 70 拉近不少了。 据悉,华为 Mate 70 性能会大幅提升,并且销量相比 Mate 60 预计增长40% - 50%,且备货充足。如果 iPhone 16 发售日期与 Mate 70 重合,销量很可能被瞬间抢购。 不过,iPhone 16 还有一个阵地暂时难...
  • 酷凛 ID-COOLING 推出霜界 240/360 一体水冷散热器,239/279 元

    酷凛 ID-COOLING 推出霜界 240/360 一体水冷散热器,239/279 元
    本站 5 月 16 日消息,酷凛 id-cooling 近日推出霜界 240/360 一体式水冷散热器,采用黑色无光低调设计,分别定价 239/279 元。 本站整理霜界 240/360 散热器规格如下: 酷凛宣称这两款水冷散热器搭载“自研新 V7 水泵”,采用三相六极马达和改进的铜底方案,缩短了水流路径,相较上代水泵进一步提升解热能力。 霜界 240/360 散热器的水泵为定速 2800 RPM 设计,噪声 28db (A)。 两款一体式水冷散热器采用 27mm 厚冷排,...
  • 惠普新款战 99 笔记本 5 月 20 日开售:酷睿 Ultra / 锐龙 8040,4999 元起

    惠普新款战 99 笔记本 5 月 20 日开售:酷睿 Ultra / 锐龙 8040,4999 元起
    本站 5 月 14 日消息,继上线官网后,新款惠普战 99 商用笔记本现已上架,搭载酷睿 ultra / 锐龙 8040处理器,最高可选英伟达rtx 3000 ada 独立显卡,售价 4999 元起。 战 99 锐龙版 R7-8845HS / 16GB / 1TB:4999 元 R7-8845HS / 32GB / 1TB:5299 元 R7-8845HS / RTX 4050 / 32GB / 1TB:7299 元 R7 Pro-8845HS / RTX 2000 Ada...
  • python中def什么意思

    python中def什么意思
    python 中,def 关键字用于定义函数,这些函数是代码块,执行特定任务。函数语法为 def (参数列表)。函数可以通过其名字和圆括号调用。函数可以接受参数作为输入,并在函数体中使用参数名访问。函数可以使用 return 语句返回一个值,它将成为函数调用的结果。 Python 中 def 关键字 在 Python 中,def 关键字用于定义函数。函数是代码块,旨在执行特定任务。 语法 def 函数定义的语法如下: def (参数列表): # 函数体 示例 定义...
  • python中int函数的用法

    python中int函数的用法
    int() 函数将值转换为整数,支持多种类型(字符串、字节、浮点数),默认进制为 10。可以指定进制数范围在 2-36。int() 返回 int 类型的转换结果,丢弃小数点。例如,将字符串 "42" 转换为整数为 42,将浮点数 3.14 转换为整数为 3。 Python 中的 int() 函数 int() 函数用于将各种类型的值转换为整数。它接受任何可以解释为整数的值作为输入,包括字符串、字节、浮点数和十六进制表示。 用法 int(object, base=10) 其中...