Svelte动态更改对象时不更新每个循环

问题描述

当我尝试动态更改每个循环变量的数据时,不会刷新DOM元素。如何重绘每个循环值

<script>
    // default messages object
     let messages =[{
    "name":"John","message":"Hi","checked": false
  },{
    "name":"Anthony","message":"welcome","checked": true
  },{
    "name":"David","message":"thank you","checked": false
  }]
 //click function to change the values dynamically 
function test(){
     messages.map(ob=>{
        ob.checked = true;
    })
    console.log(messages)
}
</script>

模板代码

<div>
    {#each messages as m}
    <div>{m.checked}
        <input type="checkBox" bind:checked={m.checked}>
            {m.name}
        </div>
    {/each}
    <br>
    <button on:click={()=>{test()}}> check all values</button>
</div>

代码链接https://svelte.dev/repl/887e7e2de4114ec1bb3625c264b9a62c?version=3.24.1

任何帮助将不胜感激!谢谢:)

解决方法

仅通过在svelte中更改其属性就不能更新数组/对象。

一条简单的经验法则:已更新变量的名称必须出现在赋值的左侧。

Updating Arrays and Objects

,

map返回一个新数组,如果您是从undefined获得一个新数组,则需要分配结果并正确返回新对象

function test(){
    messages = messages.map(obj => ({
        ...obj,checked: true
    }));
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...