【问题标题】:Svelte #each not looping through dataSvelte #each 不循环数据
【发布时间】:2020-02-04 05:57:14
【问题描述】:

我正在使用 SveleteJS 进行试驾,结果卡住了

制作了一个Dashboard 组件,在该组件内部,我放置了一个白板组件:

<script>
    import Whiteboard from "./Whiteboard.svelte";
    export let name;
</script>

<div class="box part-of-dashboard">
    <Whiteboard lines={[]} />
</div>

Whitebord.svelte:

<script>
    export let lines = [];

    export function addLine() {
        lines.push("blah");
        console.log(lines);
    }

</script>

<div style="background-color:red">
    {#each lines as line}
        <div>
            {line}
        </div>
    {/each}
</div>
<div>
    <button on:click={addLine}>
        Add Line
    </button>
</div>

当我点击按钮时,console.log 触发,我可以看到线条的大小增加,但我没有看到它在页面上呈现,只有空的红色 div 包裹它。

我尝试将$: 添加到不同的地方,但我还不确定它应该在哪里使用以及不应该在哪里使用,并不是说它有什么不同。

我如何让#each 呈现一个 div 列表(以及从on:click 传递数据的正确方法是什么,执行 {addLine('blah')} 在页面加载时执行 addLine )?

【问题讨论】:

    标签: javascript svelte svelte-component svelte-3


    【解决方案1】:

    因此,这种情况与人们的预期背道而驰,但 Svelte 并未将 [].push() 检测为改变数组变量的状态。这就是为什么控制台日志显示变量正在更新,但 Svelte 的渲染没有响应的原因。

    经过一番挖掘,我发现了几个线程(12)指出了这一点,并澄清这对于在任何对象上调用方法都是正确的。

    编辑:现在在文档/教程中也明确指出 - 请参阅 "Updating Arrays and Objects"

    最简单的解决方案之一(根据链接的线程和文档)是简单地将变量值重新分配给自身; Svelte 将拾取并重新渲染。所以,在你的场景中,我所要做的就是让你的代码正常工作:

    export function addLine() {
        lines.push("blah");
        console.log(lines);
    }
    

    与:

    export function addLine() {
        lines.push("blah");
        lines = lines;
        console.log(lines);
    }
    

    【讨论】:

    • 这完全有道理,对于更改检测来获取更改,需要更改指针。这可能会更干净:lines = lines.concat("blah");
    • @JanVladimirMostert 好点,是的,我认为这看起来不错。或者很多人使用扩展运算符(lines = [...lines, "blah"]),或者在推送后切片(lines = lines.slice())。但是 concat 可能是这里最快和最干净的单行方法。
    • 这是一个非常有帮助的答案,谢谢。他们应该在他们的介绍文档中更多地强调这个问题!
    • 谢谢你让我发疯了
    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多