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

React JS中使用filter从map渲染数组过滤多值仅生效1个问题排查

问题原因

你的问题核心是React的setState为异步批量更新机制:setState调用后不会立刻修改当前组件的state值,而是将更新推入队列等待批量执行。你在for循环中多次调用setState过滤时段时,每次读取的this.state.timeslots都是循环开始前的初始值,而非上一次setState修改后的值,多次更新的timeslots会互相覆盖,最终仅最后一次过滤操作生效,因此只能删掉一个时段。

修复方案

先在内存中完成所有过滤逻辑,再一次性更新state即可,修改后代码如下:

handleDayClick(day) {
    // 先拿到完整的初始时段列表
    let availableTimeslots = [...this.state.timeslotsReset];
    // 筛选出当前选中日的所有禁用时段
    const currentDayDisabled = this.state.timeslotsDisabled.filter(item => {
        const itemDate = new Date(item.date);
        return itemDate.getFullYear() === day.getFullYear() 
            && itemDate.getMonth() === day.getMonth() 
            && itemDate.getDate() === day.getDate();
    });
    // 一次性过滤所有禁用时段
    availableTimeslots = availableTimeslots.filter(item => 
        !currentDayDisabled.some(disabled => disabled.time === item)
    );
    // 一次性更新state
    this.setState({
        timeslots: availableTimeslots,
        selectedDay: day
    });
}

该方案同时避免了循环内频繁调用setState导致的不必要重渲染,性能和可读性都更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 02:06:00