Update
自 v3.28.0 起,此关键功能现已成为 Svelte 的一部分(请参阅issue https://github.com/sveltejs/svelte/issues/1469#issuecomment-698955660).
语法如下:
{#key expression}...{/key}
之前的回答
在 React 中,您可以使用key
prop 使渲染器重新创建一个可以重用的元素(相同的标签等)。
// React
<Todos items={items} key={currentCategory} />
但 Svelte 不支持key
, 可以?嗯,有点。 Svelte 确实具有等效功能,但仅限于{#each ...}
blocks.
语法是这样的(docs https://svelte.dev/docs#each-- 文档中没有提到这个精确的语法,但我想它只是被遗忘了):
{#each expression as name (key)}...{/each}
就像在 React 中一样,当键的值发生变化时(否则会重用),组件将被重新创建。
还有苏...
<script>
export let allItems
export let currentCategory
$: items = allItems.filter(x => x.category === currentCategory)
</script>
{#each [items] as todos (currentCategory)}
<Todos {todos} />
{/each}
呼呼。正确的?
Using currentCategory
作为密钥将创建一个新的<Todos />
每次类别更改时组件,这可能是您在您的情况下想要的。
就像在 React 中一样,必须明智地选择键的值,以便在每次需要时重新创建,但不能更多(否则它会杀死您的情况下所需的项间转换)。
键的值不限于每个循环中当前评估的项。它可以来自 Svelte 范围内的任何地方,因此您可以发挥创意。它甚至可以是一个内联对象{}
这会重新创建......嗯,基本上一直!
Edit
您可以将 hack 变成它自己的组件,以便消费者获得更清晰的语法:
<!-- Keyed.svelte -->
<script>
export let key
// we just need a 1-length array
const items = [0]
</script>
{#each items as x (key)}
<slot />
{/each}
像这样使用:
<script>
import Keyed from './Keyed.svelte'
export let items
export let category
</script>
<Keyed key={category}>
<Todos {items} />
</Keyed>
See example https://svelte.dev/repl/2373af8e5b5448c1821ceffe95bd3f26?version=3.15.0在 Svelte 的 REPL 中。