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

React电话簿应用删除联系人按钮功能实现求助

实现电话簿联系人删除功能的方法

步骤1:在App组件中添加删除函数

联系人数据entries的状态由App组件管理,因此删除逻辑需要写在App中。我们通过过滤数组移除指定联系人:

function App() {
  const [entries, setEntries] = useState(entries_data);

  useEffect(() => {
    console.log("application:", JSON.stringify(entries, null, 2));
    return () => console.log("App is re-rendering!");
  });

  const addEntry = entry => {
    setEntries(entries => [...entries, entry]);
  };

  // 新增删除函数:过滤掉目标联系人
  const deleteEntry = (entryToDelete) => {
    setEntries(prevEntries => 
      prevEntries.filter(entry => entry.Name !== entryToDelete.Name)
    );
  };

  return (
    <section>
      <h1>Phone Book</h1>
      <PhoneBookForm addEntry={addEntry} />
      {/* 将删除函数传递给展示组件 */}
      <InformationTable entries={entries} deleteEntry={deleteEntry} />
    </section>
  );
}

注意:用Name作为判断依据存在重名风险,建议给每个联系人添加唯一id字段优化逻辑:

// 添加联系人时生成唯一id
const addEntry = entry => {
  setEntries(entries => [...entries, {...entry, id: Date.now()}]);
};

// 基于id删除
const deleteEntry = (entryToDelete) => {
  setEntries(prevEntries => 
    prevEntries.filter(entry => entry.id !== entryToDelete.id)
  );
};

步骤2:修改联系人条目组件,添加删除按钮

让每个联系人条目带上删除按钮,点击时触发删除函数:

function PhoneBookEntry({ entry, deleteEntry }) {
  return (
    <tr>
      <td>{entry.Name}</td>
      <td>{entry.phone}</td>
      <td>
        <button 
          onClick={() => deleteEntry(entry)}
          style={{padding: "4px 8px", cursor: "pointer"}}
        >
          删除
        </button>
      </td>
    </tr>
  );
}

步骤3:更新展示组件,传递删除函数

修改InformationTable组件,接收删除函数并传递给每个联系人条目,同时新增操作列:

function InformationTable({ entries, deleteEntry }) {
  return (
    <>
      <table style={style.table} className="informationTable">
        <thead>
          <tr>
            <th style={style.tableCell}>Name</th>
            <th style={style.tableCell}>Phone</th>
            <th style={style.tableCell}>操作</th>
          </tr>
        </thead>
        <tbody>
          {!entries.length && <tr><td colSpan="3">No data :( </td></tr>}
          {entries.map(entry => (
            <PhoneBookEntry 
              entry={entry} 
              key={entry.Name} {/* 若用id则改为entry.id */}
              deleteEntry={deleteEntry}
            />
          ))}
        </tbody>
      </table>
    </>
  );
}

(可选)实现批量删除功能

如果需要使用表格下方的批量删除按钮,可按以下方式修改InformationTable:

function InformationTable({ entries, setEntries }) {
  const [selectedEntries, setSelectedEntries] = useState([]);

  // 切换单条选中状态
  const toggleSelect = (entry) => {
    setSelectedEntries(prev => 
      prev.includes(entry) 
        ? prev.filter(item => item.Name !== entry.Name)
        : [...prev, entry]
    );
  };

  // 批量删除选中条目
  const handleBatchDelete = () => {
    setEntries(prevEntries => 
      prevEntries.filter(entry => !selectedEntries.includes(entry))
    );
    setSelectedEntries([]);
  };

  return (
    <>
      <table style={style.table} className="informationTable">
        <thead>
          <tr>
            <th style={style.tableCell}>
              <input type="checkbox" onChange={(e) => {
                // 全选/取消全选
                setSelectedEntries(e.target.checked ? [...entries] : []);
              }}/>
            </th>
            <th style={style.tableCell}>Name</th>
            <th style={style.tableCell}>Phone</th>
          </tr>
        </thead>
        <tbody>
          {!entries.length && <tr><td colSpan="3">No data :( </td></tr>}
          {entries.map(entry => (
            <tr key={entry.Name}>
              <td>
                <input 
                  type="checkbox" 
                  checked={selectedEntries.includes(entry)} 
                  onChange={() => toggleSelect(entry)}
                />
              </td>
              <td>{entry.Name}</td>
              <td>{entry.phone}</td>
            </tr>
          ))}
        </tbody>
      </table>
      <br />
      <input 
        style={style.form.deleteBtn} 
        type="button" {/* 改为button类型,避免触发表单提交 */}
        value="Delete Selected" 
        onClick={handleBatchDelete}
        disabled={selectedEntries.length === 0} {/* 无选中时禁用 */}
      />
    </>
  );
}

同时需要在App组件中把setEntries传递给InformationTable。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:25:22