如何使用 Svelte 为元素的内部变化设置动画?

How to animate an element on an inner change with Svelte?

Svelte 中的过渡仅适用于进入或退出 DOM 的元素。

例如,当 div 最初添加到 DOM 时,这将应用淡入淡出:

<div in:fade>{message}</div>

我们如何在 message 更改时添加过渡?

由于 Svelte 不能在单个元素上设置键,我发现的唯一解决方案是使用单个元素数组在数组发生变化时触发 DOM 中的新元素,这似乎并不理想:

<script>
let messages = ['hello world'];

function updateMessages (message) {
    messages = [message];
}
</script>

{#each messages as message (message)}
    <div in:fade>{message}</div>
{/each}

你的 #each hack 确实是目前推荐的方法(我们将来可能会添加类似 key 指令的东西,但没有承诺)——我只想做一个改变,这是做 #each [x] as x 而不是单独维护一个数组:

<script>
let message = 'hello world';

function updateMessages (new_message) {
    message = new_message;
}
</script>

{#each [message] as message (message)}
    <div in:fade>{message}</div>
{/each}

从 Svelte 3.28 开始,有一个实现该功能的 {#key} - 请参阅 https://svelte.dev/docs#key

例如,这将导致 运行 每当值发生变化时它的转换。

{#key value}
    <div transition:fade>{value}</div>
{/key}