View 在Svelte中,可以使用“array=array”将数组标记为需要在视图中刷新?

View 在Svelte中,可以使用“array=array”将数组标记为需要在视图中刷新?,view,svelte,dirty-checking,View,Svelte,Dirty Checking,即使用 array = array; 是否触发视图以使用当前阵列刷新 例如,以下使用 cards = [...cards, {name}]; 将条目添加到阵列卡,但通过将卡分配到新阵列,视图中的卡将被刷新 样本: 只要输入一些名字,下面的列表就会更新 但是,当输入n个名称时,此选项处于打开状态,因为每次都会打开新数组的创建。如果1用户希望一次输入几个或十几个名称,这不是什么大问题,或者2用户可能会键入一个名称,持续几秒到20秒,那么当输入的名称达到1000或2000个时,UI延迟0.2秒并不

即使用

array = array;
是否触发视图以使用当前阵列刷新

例如,以下使用

cards = [...cards, {name}];
将条目添加到阵列卡,但通过将卡分配到新阵列,视图中的卡将被刷新

样本: 只要输入一些名字,下面的列表就会更新

但是,当输入n个名称时,此选项处于打开状态,因为每次都会打开新数组的创建。如果1用户希望一次输入几个或十几个名称,这不是什么大问题,或者2用户可能会键入一个名称,持续几秒到20秒,那么当输入的名称达到1000或2000个时,UI延迟0.2秒并不是什么大问题。用户可能会更好地添加到服务器和数据库中,以防断电

但如果我们不希望准时,我们也可以使用:

    cards.push({name});
    cards = cards;
这将触发视图中的刷新。所以斯维特不做肮脏的检查?与Angular、Vue和React相比,它们通过实际将数组转换为字符串并检查数组是否已更改来执行脏检查,这是真的吗

样本:

不带线路卡=卡;,该列表不会在视图中更新:

样本:

所以斯维特实际上不做肮脏的检查,而是使用卡片;作为一个提示,卡片已经改变了,即使是通过卡片=卡片?那么,如果我们使用array.push,那么我们可以将其作为一种通用技术来标记脏的东西,这样程序就可以运行得更快吗?斯维特真的能通过检测到有一个cards.push语句来猜测卡片已经改变了吗

更新:发现通过向每个列表项添加一个键,cards=cards是不需要的,我想知道为什么:


您可以使用自定义存储来模拟检测推送方法引起的更改

请看Rich Harris的回复

将变量赋值给它本身就是向编译器发出的提示,提示需要更新视图的相关部分-。它的设计允许您在性能需要的地方使用可变对象和数组,但会促使您使用不可变的数据结构,因为这通常会导致更少的bug

检测数组之类的东西。推。。。实际上并不实用——最好用一种简单明了的方式告诉编译器“这已经改变了”,赋值运算符就是这样


它之所以适用于已设置关键帧的每个块,而不是未设置关键帧的块,实际上是因为存在一个错误-我提出了一个问题:

我发现,通过向每个列表项添加一个关键帧,问题末尾不需要cards=cards。我正试图找出原因
<ul>
  {#each cards as card, i (i)}
    <li>{card.name}</li>
  {/each}
</ul>