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

React中多MaterialUI Card组件同步变更问题求助

问题原因与解决方法

你的问题和key无关——key只是React用来识别列表元素唯一性的标识,不负责状态隔离。真正的问题是所有卡片共用了同一组状态变量,比如展开状态、Select选中值都是全局的,所以操作一个卡片时,所有依赖这些状态的组件都会同步变化。

解决核心是给每个卡片单独维护状态,具体操作如下:

  1. 重构状态存储方式
    把原来的单个展开状态、选中值,改成用对象存储每个卡片的独立状态,键用卡片数据的唯一标识(比如你的item.id):

    // 替换原来的expanded和selected状态
    const [cardStates, setCardStates] = useState({});
    
  2. 修改展开/收起的事件处理
    给点击事件传入当前卡片的id,只更新对应卡片的展开状态:

    const handleExpandClick = (id) => {
      setCardStates(prevStates => ({
        ...prevStates,
        // 切换当前卡片的展开状态,默认未展开为false
        [id]: !prevStates[id]
      }));
    };
    

    然后在Card的展开组件中,绑定对应卡片的状态:

    <ExpandMore
      expand={cardStates[item.id] || false}
      onClick={() => handleExpandClick(item.id)}
    />
    
  3. 修改Select的事件处理
    同样传入卡片id,只更新当前卡片的选中值:

    const handleSelectChange = (id, event) => {
      setCardStates(prevStates => ({
        ...prevStates,
        // 用`selected_${id}`作为键区分不同卡片的选中值
        [`selected_${id}`]: event.target.value
      }));
    };
    

    给Select绑定对应卡片的选中值:

    <Select
      value={cardStates[`selected_${item.id}`] || ''}
      onChange={(e) => handleSelectChange(item.id, e)}
    >
      {/* 选项内容 */}
    </Select>
    

这样每个卡片的状态都会独立存储、独立更新,就不会出现所有卡片同步变化的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:13:30