javascript - 处理 Svelte 组件 Prop 的最佳方式

标签 javascript tailwind-css svelte sveltekit

我正在使用 SvelteKit 和 Tailwind 构建应用程序。我知道在使用 Tailwind 设计样式时,建议利用组件来减少必须使用 Tailwinds 实用程序类编写的重复代码量。我的问题是,当基于 HTML 标签制作组件时,例如 <input>标签,在该组件中处理通常只是该标签属性的 Prop 变得势不可挡。 MDN 显示 <input>标签有 31 个可能的属性。我知道我不会使用所有这些,但是来回将它们作为 props 添加到组件中会变得很烦人。

解决这个问题的最佳方法是什么而不加起来 31 行 export let attribute到组件并将它们添加到组件内的真实 HTML 标记?

例子:

<script>
    export let name;
    export let id;
    export let type;
    export let disabled;
    export let required;
    export let minLength;
    export let maxLength;
    export let min;
    export let max;
    export let pattern;

    let value;
    let borderColor = '#D1D5DB';

    const inputHandler = (e) => {
        if (e.target.value === '') {
            borderColor = '#D1D5DB';
        } else {
            borderColor = '';
        }
    };
</script>

<input
    {name}
    {id}
    {type}
    {disabled}
    {required}
    {minLength}
    {maxLength}
    {min}
    {max}
    {pattern}
    on:input={inputHandler}
    style={`border-color: ${borderColor}`}
    class="
    w-full px-1 py-px mb-4 bg-transparent border-2 border-gray-300 
    rounded-xl last:mb-0 valid:border-emerald-300 invalid:border-rose-400
  "
/>

最佳答案

如果你想能够做到

<MyInputField name="123" maxLength="5" type="text">

无需声明所有这些额外的属性,最好的方法是使用 $$restProps,该对象将包含所有已传递给组件但尚未传递的 props被明确定义为 Prop (导出)。

<script>
  export let name = "";
</script>

<input name={name} {..$$restProps}>

(这里定义了name,所以不会包含在$$restProps中,需要自己添加)

关于javascript - 处理 Svelte 组件 Prop 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72296342/

相关文章:

javascript - 如何使用 Svelte 传播 Prop

javascript - css Onclick在页面底部显示div

javascript - 如何在javascript中不重复地随机生成数字?

javascript - 将 CSS 样式指定给 Slickgrid 单元格

css - 带有可滚动内容的嵌套粘性侧边栏

javascript - 在 Svelte 中使用 {#each} 动态创建 div

javascript - 将 @media 查询与 javascript 结合使用以动态更改 css

vue.js - 将多个类绑定(bind)到单个变量

jquery - 如何在选择框的第一项被选中时使颜色变为灰色

javascript - 如何在 HTML 中创建第二个视口(viewport)?