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

React JS数组删除对象问题求助:现有代码无法实现删除功能

React数组对象删除失效问题解决

问题重现

在React中尝试删除数组内的对象时无法生效,相关代码如下:

数组定义

export const SavedList = [
    {
      word: 'hello',
      translate: 'привет',
      note: 'say say'
    }
]
class Menu extends Component {
  state = { 
    word: '',
    translate: '',
    note: '',
    data: SavedList,
  }
  deletePost =(id)=>{
    this.setState({
      data : this.state.data.filter((el)=> el.id !== id)
    })
  }
  render() {
    return (
          <div className="content">
            <Routes>
              <Route path="/" element={<Layout />}>
                  <Route path="saved" element={<Saved data={this.state.data} del={this.deletePost}/>}/>
              </Route>
            </Routes>
            <div>
            </div>
        </div>
    );
  }
}
export default Menu;

Saved组件(包含删除按钮)

class Saved extends Component {
  render() {
    const sl = this.props.data.map((sl, id) => {
      return (
        <div className="saved-card" key={id}>
          <div className="content">
            <p>{id}</p>
            <p>{sl.word}</p>
            <p>{sl.translate}</p>
            <p>{sl.note}</p>
          </div>
          <div className="btn-block">
            <button
              onClick={() => this.props.del(id)}
              type="button"
              className="delete-btn"
            >
              delete
            </button>
          </div>
        </div>
      );
    });
    return (
      <div>
        <h2>Saved list</h2>
        <div className="saved-inner">
          <div className="saved-list">{sl}</div>
        </div>
      </div>
    );
  }
}

export default Saved;

问题原因

  1. 数组元素缺少唯一id属性:SavedList中的对象没有id字段,导致deletePost函数里的el.id !== id条件永远为true,过滤后数组无变化。
  2. 使用数组索引作为标识存在风险:即使勉强用索引匹配,数组元素顺序变化(如删除元素后)会导致索引重新排列,可能删除错误元素。

修复方案

步骤1:给数组对象添加唯一id

修改SavedList,为每个对象添加唯一标识:

export const SavedList = [
    {
      id: 1, // 添加唯一id,新增元素需保证id唯一
      word: 'hello',
      translate: 'привет',
      note: 'say say'
    }
]

步骤2:修改Saved组件,传递对象id而非索引

在map循环中使用对象自身的id作为标识,并传递给删除函数:

class Saved extends Component {
  render() {
    const sl = this.props.data.map((sl) => {
      return (
        <div className="saved-card" key={sl.id}> {/* 用对象id作为key,更稳定 */}
          <div className="content">
            <p>{sl.id}</p> {/* 显示对象id */}
            <p>{sl.word}</p>
            <p>{sl.translate}</p>
            <p>{sl.note}</p>
          </div>
          <div className="btn-block">
            <button
              onClick={() => this.props.del(sl.id)} // 传递对象的id
              type="button"
              className="delete-btn"
            >
              delete
            </button>
          </div>
        </div>
      );
    });
    return (
      <div>
        <h2>Saved list</h2>
        <div className="saved-inner">
          <div className="saved-list">{sl}</div>
        </div>
      </div>
    );
  }
}

export default Saved;

步骤3:优化state初始化(可选但推荐)

初始化state时复制原数组,避免直接引用常量导致的潜在问题:

state = { 
  word: '',
  translate: '',
  note: '',
  data: [...SavedList], // 展开运算符复制数组
}

完成以上修改后,删除功能即可正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:21:00