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

React Native:获取选中TouchableOpacity的ID以删除条目问题求助

解决删除条目后无法正确获取后续选中ID的问题

你的问题核心出在三个地方:用数组索引作为组件key、点击事件参数传递错误、删除逻辑未正确更新状态。以下是具体修复步骤:

1. 替换map的key为唯一ID

你当前用index作为BookItem的key,删除条目后数组索引会重新排列,React会复用旧组件导致状态混乱。直接用每个图书的唯一id作为key:

修改父组件中的map渲染部分:

{books.map((book) => (
  <BookItem 
    key={book.id} 
    bookId={book.id} 
    name={book.name} 
    description={book.description} 
    updatedAt={book.updatedAt} 
  />
))}

2. 正确传递点击事件的参数

当前TouchableOpacity的onPress直接绑定deleteItem,没有传递bookId,导致函数无法拿到正确的目标ID。需要用箭头函数包裹传递参数:

修改子组件的TouchableOpacity:

<TouchableOpacity onPress={() => deleteItem(bookId)}>
  <Text>{name}</Text>
  <Text>{description}</Text>
  <Text>{updatedAt}</Text>
</TouchableOpacity>

3. 实现正确的删除逻辑并更新父组件状态

删除操作需要通知父组件更新books数组,所以子组件需要接收一个删除回调函数,而非自行处理删除逻辑。

子组件修改:

// 更新props类型,添加删除回调
type BookItemProps = {
  name: string;
  description: string;
  bookId: string;
  updatedAt: string;
  onDelete: (id: string) => void;
}

export default function BookItem({ name, description, bookId, updatedAt, onDelete }: BookItemProps) {
  return(
    <TouchableOpacity onPress={() => onDelete(bookId)}>
      <Text>{name}</Text>
      <Text>{description}</Text>
      <Text>{updatedAt}</Text>
    </TouchableOpacity>
  )
}

父组件修改:

添加删除函数并传递给BookItem:

// 父组件中实现删除逻辑
const handleDelete = (bookId: string) => {
  // 过滤掉要删除的条目,更新状态
  setBooks(prevBooks => prevBooks.filter(book => book.id !== bookId));
}

// 在map中传递onDelete回调
{books.map((book) => (
  <BookItem 
    key={book.id} 
    bookId={book.id} 
    name={book.name} 
    description={book.description} 
    updatedAt={book.updatedAt}
    onDelete={handleDelete}
  />
))}

4. 统一props类型(可选但推荐)

父组件中的BookProps和子组件的BookItemProps可以统一,避免类型混淆:

// 父组件定义统一的图书类型
type Book = {
  id: string;
  name: string;
  description: string;
  updatedAt: string;
  authorId: string;
}

const [books, setBooks] = useState<Book[]>([])

// 子组件复用类型,只取需要的字段加回调
export default function BookItem({ name, description, bookId, updatedAt, onDelete }: Pick<Book, 'name' | 'description' | 'updatedAt'> & { bookId: string, onDelete: (id: string) => void }) {
  // ...组件内容
}

完成以上修改后,每次删除条目都会正确更新数组,后续点击也能获取到正确的图书ID,不会再出现旧ID残留的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:42:24