贝利信息

如何解决 React 中删除后无法立即重新添加相同项的问题

日期:2026-01-22 00:00 / 作者:霞舞

react 中因 `

在你提供的代码中,问题并非出在 useState 更新逻辑或 filter 删除方式上,而是一个经典但容易被忽

略的 DOM 行为陷阱

更严重的是,你的当前实现存在多个非 React 推荐的反模式:

✅ 正确解法:

以下是优化后的完整实现:

import React, { useState } from 'react';
import foods from 'json/foods';

const MealManager = () => {
  const [meal, setMeal] = useState([] as typeof foods);
  const [selectedFoodId, setSelectedFoodId] = useState(''); // ✅ 受控状态

  const removeItem = (id: string) => {
    setMeal(prev => prev.filter(item => item.id !== id));
  };

  const handleAdd = () => {
    if (!selectedFoodId) return;

    const foodToAdd = foods.find(f => f.id === selectedFoodId);
    if (!foodToAdd) return;

    // ✅ 防重复:检查当前 meal 中是否已存在同 id 项(推荐用 id 判断,而非 name)
    if (meal.some(item => item.id === foodToAdd.id)) {
      alert(`"${foodToAdd.name}" is already in the list.`);
      return;
    }

    setMeal(prev => [...prev, foodToAdd]); // ✅ 函数式更新,确保基于最新状态
  };

  return (
    
      {/* 渲染已选餐食 */}
      
        {meal.map((item) => (
          
            

{item.name}

Protein: {item.protein}

Fats: {item.fats}

Carbs: {item.carbs}

))} {/* 添加区域:受控 select + 明确 Add 按钮 */} ); }; export default MealManager;

? 关键改进说明:

? 额外建议:

遵循以上模式,你将彻底解决“删后不能立刻重加”的问题,并写出更可维护、符合 React 最佳实践的代码。