如何在 Svelte 中循环每个数组时弹出数组?
How to pop array while looping with each in Svelte?
<script>
let myMessages = ["msg1", "msg2", "msg3"]
</script>
{#each myMessages as message}
<div>{message}</div>
{/each}
我想在添加到 DOM 后从 myMessages 中删除每个元素,所以最后 myMessages 是空的?
(对此的一个变体是在循环中添加一个 {#if} 条件,并且仅当元素满足此条件时才删除)
Svelte's reactivity system基于赋值运算符=
未检测到数组的突变(使用 pop()
之类的方法)。
myMessages.pop()
myMessages = myMessages // this line will trigger svelte to update the dom
在没有关于 DOM 渲染的反馈的情况下,我会假设它。因此,要呈现 msg1 并在之后弹出它,我将按如下方式进行:
<script>
let myMessages = []
let tmpMessages = myMessages
# then add msg1 to myMessages, render it and pop it
myMessages.push("msg1")
tmpMessages = myMessages
myMessages.pop()
</script>
{#each tmpMessages as message}
<div>{message}</div>
{/each}
这可以通过创建一个消息组件来实现,该组件在 created/mounted 时将自己的删除(从数组中删除)分派给父应用程序。像这样,以后可以使用相同的功能将更多消息添加到 myMessages 数组。
[App.svelte]
<script>
import { onMount } from 'svelte';
import Message from './Message.svelte'
let myMessages = ["msg1", "msg2", "msg3"]
// add two additional Messages 1,5s after App creation
onMount( () => {
setTimeout(function() {
myMessages = [...myMessages, "msg4","msg5"];
}, 1500);
});
function deleteMessage(event){
myMessages = myMessages.slice(1)
console.log(myMessages)
}
</script>
{#each myMessages as message}
<Message {message} on:delete={deleteMessage}/>
{/each}
[Message.svelte]
<script>
import { onMount } from 'svelte';
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let message;
onMount( () => {
setTimeout(function() {
dispatch('delete', {
});
}, 3000);
});
</script>
<div> {message} </div>
或者,因为没有发送信息,只触发了删除,没有像这样发送->
Demo REPL
[App.svelte]
<script>
import { onMount } from 'svelte';
import Message from './Message.svelte'
let myMessages = ["msg1", "msg2", "msg3"]
// add two additional Messages 1,5s after App creation
onMount( () => {
setTimeout(function() {
myMessages = [...myMessages, "msg4","msg5"];
}, 1500);
});
function deleteMessage() {
// delete first element in arr
myMessages = myMessages.slice(1)
console.log(myMessages)
}
</script>
{#each myMessages as message}
<Message {message} {deleteMessage} />
{/each}
[Message.svelte]
<script>
import { onMount } from 'svelte';
export let message;
export let deleteMessage;
onMount( () => {
setTimeout(function() {
deleteMessage();
}, 3000);
});
</script>
<div> {message} </div>
<script>
let myMessages = ["msg1", "msg2", "msg3"]
</script>
{#each myMessages as message}
<div>{message}</div>
{/each}
我想在添加到 DOM 后从 myMessages 中删除每个元素,所以最后 myMessages 是空的?
(对此的一个变体是在循环中添加一个 {#if} 条件,并且仅当元素满足此条件时才删除)
Svelte's reactivity system基于赋值运算符=
未检测到数组的突变(使用 pop()
之类的方法)。
myMessages.pop()
myMessages = myMessages // this line will trigger svelte to update the dom
在没有关于 DOM 渲染的反馈的情况下,我会假设它。因此,要呈现 msg1 并在之后弹出它,我将按如下方式进行:
<script>
let myMessages = []
let tmpMessages = myMessages
# then add msg1 to myMessages, render it and pop it
myMessages.push("msg1")
tmpMessages = myMessages
myMessages.pop()
</script>
{#each tmpMessages as message}
<div>{message}</div>
{/each}
这可以通过创建一个消息组件来实现,该组件在 created/mounted 时将自己的删除(从数组中删除)分派给父应用程序。像这样,以后可以使用相同的功能将更多消息添加到 myMessages 数组。
[App.svelte]
<script>
import { onMount } from 'svelte';
import Message from './Message.svelte'
let myMessages = ["msg1", "msg2", "msg3"]
// add two additional Messages 1,5s after App creation
onMount( () => {
setTimeout(function() {
myMessages = [...myMessages, "msg4","msg5"];
}, 1500);
});
function deleteMessage(event){
myMessages = myMessages.slice(1)
console.log(myMessages)
}
</script>
{#each myMessages as message}
<Message {message} on:delete={deleteMessage}/>
{/each}
[Message.svelte]
<script>
import { onMount } from 'svelte';
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let message;
onMount( () => {
setTimeout(function() {
dispatch('delete', {
});
}, 3000);
});
</script>
<div> {message} </div>
或者,因为没有发送信息,只触发了删除,没有像这样发送-> Demo REPL
[App.svelte]
<script>
import { onMount } from 'svelte';
import Message from './Message.svelte'
let myMessages = ["msg1", "msg2", "msg3"]
// add two additional Messages 1,5s after App creation
onMount( () => {
setTimeout(function() {
myMessages = [...myMessages, "msg4","msg5"];
}, 1500);
});
function deleteMessage() {
// delete first element in arr
myMessages = myMessages.slice(1)
console.log(myMessages)
}
</script>
{#each myMessages as message}
<Message {message} {deleteMessage} />
{/each}
[Message.svelte]
<script>
import { onMount } from 'svelte';
export let message;
export let deleteMessage;
onMount( () => {
setTimeout(function() {
deleteMessage();
}, 3000);
});
</script>
<div> {message} </div>