Svelte:以可重用的方式关联标签和输入

Svelte: Associate label and input in a reusabe way

我正在构建一个 Svelte 输入组件,它应该可以在同一页面上多次使用。

<div>
    <label>{label}</label>
    <div>
        <input bind:value>
        <!-- some more elements -->
    </div>
</div>

尝试关联标签和输入时遇到以下问题:

有没有一种方法可以在 Svelte 中创建组件实例的唯一 ID(前置或后置),或者是否有其他解决方案来解决这个问题。


或者手动将随机字符串设置为 id 是最好的解决方案吗?

<script>
    const id = random_string();
    /* ... */
</script>

<div>
    <label for={id}>{label}</label>
    <div>
        <input {id} bind:value>
        <!-- some more elements -->
    </div>
</div>

为什么不为输入定义一个唯一的名称,因为您需要一个名称?然后你可以有一个像这样的组件:

Input.svelte

<script>
    export let name
    export let label
    let value
        
    const getInputId = () => {
        return `input_${name}`
    }
</script>

<div>
    <label for={getInputId()}>{label}</label>
    <div>
        <input id={getInputId()} bind:value>
    </div>
</div>

并像这样使用它:

App.svelte

<script>
    import Input from './Input.svelte'
</script>

<Input name='country' label='Select Country' />

查看 REPL

您可以在模块上下文中定义一个计数器,然后使用它来创建唯一 ID

Input.svelte

<script context="module">
    let counter = 0
</script>
<script>
        export let label
        let value
        let eltId = 'input_'+ counter++
</script>

<div>
    <label for={eltId}>{label}</label>
    <div>
        <input id={eltId} bind:value>
    </div>
</div>    

App.svelte

<script>
    import Input from './Input.svelte'
</script>

<Input label='Select Country' />
<Input label='Select Country' />
<Input label='Select Country' />

REPL