我正在 Svelte 中开发一个甘特图组件,它由 100 个行组件组成,每个组件都包含多个任务组件。可以拖动和移动任务。性能是重中之重,我使用虚拟列表仅呈现可见行。
<div class="scrollable">
{#each visibleRows as row (row.id)}
<div class="row">
{#each row.tasks as task (task.id)}
<Task from={task.from} to={to}/>
{/each}
</div>
{/each}
</div>
问题是当我移动任务并将行滚动出视图时,它们会被破坏,当我滚动回它们时,它们的状态会被重置。这个使用 svelte-virtual-list 的 REPL 说明了问题https://svelte.technology/repl?version=2.13.5&gist=bdb4c523d2e1cf7e3aef452e3f24d988 我想知道处理这种情况的最佳方法是什么。
目前我正在使用任务对象作为道具并对其进行更新,引用保持不变并且滚动不会影响它。
<Task {task}/>
但是在任务中我像这样更新状态
const {task} = this.get();
task.from = new Date();
this.set({task});
并且模板使用 task.propname 引用每个道具,我不确定这是否是这样做的苗条方式,因为不清楚究竟设置了什么。
我可以像这样绑定任务变量
<Task bind:from=task.from
bind:to={task.to}/>
但是需要绑定很多变量(超过 10 个),我希望未来可能的插件可以从 Task 组件内部更新新的道具。
<Task {task}
{...task}/>
这处理潜在的更多道具,但我在状态事件中更新任务对象,如下所示:
onstate({ changed, current, previous }) {
const {task} = this.get();
Object.assign(task, current);
this.set({task});
},
我应该更喜欢哪一个来提高性能,或者有更好的方法来处理这个问题?