You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte中#each循环如何在sorting数组变更时响应式更新

问题:Svelte中sorting数组变化时如何刷新#each循环?

我为表格的表头和数据分别设置了独立数组,希望为表头(Headers数组)添加排序顺序图标,排序顺序单独存储在sorting数组中。现有代码如下:

HTML代码(Svelte模板)

{#each data.Header as h, i}
    <th class="text-start" on:click={()=>headClick(i)}><Icon name={sortOrderIcon(i)}/> {h}</th>
{/each}

JavaScript代码

function headClick(i){
    let s=_.find(sorting, o => o.col===i)
    if (_.isUndefined(s)){ 
        sorting.push({col: i, sort: 'asc'})
        return
    }
    if (s[i].sort==='asc'){ 
        s[i].sort='desc'
    }
    else { 
        _.remove(sorting, (o)=>o.col===i)
    }
}

请问如何让Svelte在sorting数组变化时刷新该#each循环?


解决方案

Svelte的响应式更新依赖赋值操作检测变化,直接用push、_.remove或修改数组内对象属性的方式,Svelte可能无法感知到变化。可以通过以下方式修复:

1. 操作后手动触发响应式更新

对数组完成增删改操作后,将数组重新赋值给自身,强制Svelte检测变化:

function headClick(i){
    let s=_.find(sorting, o => o.col===i)
    if (_.isUndefined(s)){ 
        sorting.push({col: i, sort: 'asc'})
        sorting = [...sorting] // 触发更新
        return
    }
    // 注意:原代码错误,s是找到的单个对象,直接访问s.sort即可
    if (s.sort==='asc'){ 
        s.sort='desc'
        sorting = [...sorting] // 修改对象后触发更新
    }
    else { 
        _.remove(sorting, (o)=>o.col===i)
        sorting = [...sorting] // 删除元素后触发更新
    }
}

2. 用新数组替代原数组(推荐)

每次操作都生成新数组,避免原地修改,Svelte能自动检测到变化,代码更清晰:

function headClick(i){
    const existing = sorting.find(o => o.col === i);
    if (!existing) {
        // 添加新排序规则
        sorting = [...sorting, { col: i, sort: 'asc' }];
    } else if (existing.sort === 'asc') {
        // 更新排序方向
        sorting = sorting.map(item => 
            item.col === i ? { ...item, sort: 'desc' } : item
        );
    } else {
        // 移除排序规则
        sorting = sorting.filter(item => item.col !== i);
    }
}

额外注意

确保sortOrderIcon(i)函数能根据sorting数组的当前状态正确返回对应图标名称,这样点击表头后图标才会同步更新。

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:31:07