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

React中子传父更新对象数组后页面导航数据丢失问题求助

问题根源

你现在的问题核心是没有用React状态管理数据,而是用普通let声明数组。React组件每次重新渲染(包括导航返回时组件重新挂载),let Data都会重新执行,把数组重置为初始值,之前修改的内容自然丢失。另外还有两个细节问题:foreach是拼写错误(应为forEach,JavaScript方法名大小写敏感);直接修改数组内对象的属性,即使后续改成状态,也可能因未创建新引用导致React无法检测到变化,无法触发组件更新。

解决思路

1. 改用React状态管理数据

把普通变量换成useState状态,让React追踪数据变化,组件重新渲染时不会丢失数据:

import { useState } from 'react';

const Parent = () => {
    // 用useState替代let,初始化状态数组
    const [data, setData] = useState([
        {name: 'item-1', quantity: 0},
        {name: 'item-2', quantity: 0},
        {name: 'item-3', quantity: 0},
        {name: 'item-4', quantity: 0},
        {name: 'item-5', quantity: 0},
        {name: 'item-6', quantity: 0},
    ]);

    // 后续修改getData方法...
}

2. 遵循React不可变更新原则

不能直接修改原状态里的对象,必须创建新的数组和对象,保证状态更新是不可变的,这样React才能检测到变化并触发组件更新:

const getData = (updatedItems) => {
    // 遍历子组件传回的数组,生成新的状态数组
    const newData = data.map(item => {
        const updatedItem = updatedItems.find(x => x.name === item.name);
        if (updatedItem) {
            // 返回新对象,不修改原状态对象
            return {...item, quantity: item.quantity + updatedItem.quantity};
        }
        return item;
    });
    // 用setData更新状态
    setData(newData);
}

3. 持久化数据(可选,解决页面刷新/跨导航数据保留)

如果需要导航离开再返回、甚至刷新页面后仍保留数据,要把数据存入localStorage:

import { useState, useEffect } from 'react';

const Parent = () => {
    // 初始化时优先从localStorage读取数据,无数据则用默认值
    const [data, setData] = useState(() => {
        const savedData = localStorage.getItem('itemData');
        return savedData ? JSON.parse(savedData) : [
            {name: 'item-1', quantity: 0},
            {name: 'item-2', quantity: 0},
            {name: 'item-3', quantity: 0},
            {name: 'item-4', quantity: 0},
            {name: 'item-5', quantity: 0},
            {name: 'item-6', quantity: 0},
        ];
    });

    // 状态变化时自动保存到localStorage
    useEffect(() => {
        localStorage.setItem('itemData', JSON.stringify(data));
    }, [data]);

    const getData = (updatedItems) => {
        const newData = data.map(item => {
            const updatedItem = updatedItems.find(x => x.name === item.name);
            if (updatedItem) {
                return {...item, quantity: item.quantity + updatedItem.quantity};
            }
            return item;
        });
        setData(newData);
    }

    return (
        <>
            <Child getData={getData} data={data} />
        </>
    )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:25:18