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

React父组件更新props后子组件ListItem未触发重渲染问题求助

问题原因

核心问题是违反了React状态的不可变更新原则:React对于数组、对象这类引用类型的状态,会通过引用地址判断是否发生变更,你直接修改原数组元素而不生成新数组的话,React会认为状态没有变化,因此不会触发组件重渲染,子组件自然收不到更新后的props。

你代码里有两处违反不可变原则的写法:

1. nextTask函数中的错误写法

const new_arr = statuses; // 直接赋值原数组的引用,和state指向同一个数组
// @ts-ignore
new_arr[pointer] = "inProgress"; // 直接修改原数组的元素
setStatuses(new_arr); // 传入的还是原数组的引用,React判定状态无变化

2. updateStatus函数中的错误写法

// @ts-ignore
const updateStatus = (index:number, status:string) => setStatuses(prev => prev[index] = status);
// 直接修改prev数组的元素,且返回的是修改后的元素而非新数组,完全不符合更新规范
修复方案

1. 修复nextTask函数

创建新数组再修改后提交:

const nextTask = () => {
    switch(statuses[pointer]){
        case "queued":
            // 用展开运算符生成全新的数组
            const new_arr = [...statuses];
            new_arr[pointer] = "inProgress";
            setStatuses(new_arr);    
            break;
        case "inProgress":
            break;
        case "completed":
            setPointer(prev => prev+1);
            break;
        default:
            console.log(`error: unknown value ${statuses[pointer]}`);
    }
}

2. 修复updateStatus函数

同样基于原状态生成新数组再返回:

const updateStatus = (index:number, status:string) => setStatuses(prev => {
    const newArr = [...prev];
    newArr[index] = status;
    return newArr;
});

修复后只要statuses数组内容变更,就会生成新的引用触发父组件重渲染,子组件拿到新的status props后就会正常更新图标、触发对应的useEffect监听逻辑。


内容的提问来源于stack exchange,提问作者ADSmith-0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:45:03