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

React Native购物车页渲染时函数自动执行 onPress事件触发异常

问题根因

当前onPress={removeItem(item.product.id)}的写法,会在组件渲染阶段直接执行removeItem函数,再把函数执行的返回值绑定给onPress属性,而不是把「点击触发时要执行的回调」传给onPress。所以进入购物车页渲染列表时,所有商品项的removeItem都会被直接调用,就出现了页面刚加载就打印全部商品ID的现象。

另外现有代码还有两处冗余问题:

  • useMemo的依赖项设置为[removeItem]会造成循环依赖,这里完全不需要用useMemo包裹函数
  • 传入的参数本身是单个商品ID,外层套[ids].map属于无意义操作

修复方法

1. 重写removeItem函数

去掉多余的useMemo包裹,直接定义普通函数即可:

const removeItem = (targetId) => {
  console.log(targetId)
  // 后续在这里补充实际移除购物车商品的逻辑,比如更新本地状态、调用后端接口等
}

2. 修正onPress的传参写法

用箭头函数包裹removeItem调用,确保只有点击事件触发时才会执行函数传参:

<Pressable onPress={() => removeItem(item.product.id)}>
  <FontAwesomeIcon icon={faXmark} />
</Pressable>

修复后完整代码参考
// 函数定义部分
const removeItem = (targetId) => {
  console.log(targetId)
  // 补充移除商品的业务逻辑
}

// 列表渲染部分
<ScrollView>
    {cart?.map((item, i) => {
      return (
        <View style={styles.box} key={item.product.id}>
          <View style={styles.top} >
            <Text style={styles.itemname}>{item.product.itemname}</Text>
            <View style={styles.right}>
              <Text style={styles.qty}> {item.product.price}</Text>
              <Text style={styles.qty}> x {item.qty}</Text>
              <View>
                <Pressable onPress={() => removeItem(item.product.id)}>
                  <FontAwesomeIcon icon={faXmark} />
                </Pressable>
              </View>
            </View>
          </View>
          <Text style={styles.subTotal}>subTotal:  Ksh. {item.totalPrice}</Text>
        </View>
      )
    })}
</ScrollView>

优化提示:列表渲染的key属性建议使用商品唯一ID,不要用遍历索引i,避免列表增删改时出现渲染错位、状态绑定错误的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:06:20