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

React Native中从PRODUCT组件向CART静态数组添加商品报错

解决React Native中向Cart静态数组添加商品的报错问题

嘿,我一眼就看到问题出在哪了——你踩了JavaScript大小写敏感的坑!

错误根源

你在Cart组件里定义的静态数组是小写的products:

export default class Cart extends Component{ 
  static products=[]; 
  // ...其他代码
}

但在Product组件的按钮点击事件里,你调用的是大写的Products:

Cart.Products.push({ ... })

JavaScript严格区分大小写,Cart.Products是一个未定义的属性,所以才会抛出undefined is not an object的错误。

快速修复

先把大小写统一,修改Product组件里的调用代码:

<Button 
  style={{flex:1, height:30, alignContent:'center', backgroundColor:'#8ab465'}} 
  onPress={()=>{ 
    // 改成和定义一致的小写products
    Cart.products.push({ 
      name:this.props.productName, 
      price:this.props.productPrice, 
    }) 
  }}
/>

额外提醒:静态数组无法触发组件重渲染

虽然上面的修改能解决报错,但你很快会发现新问题:往静态数组里添加商品后,Cart组件的界面不会更新。因为静态属性不属于React组件的状态(state),React不会监听它的变化,自然不会触发重渲染。

更专业的做法是用React的状态管理来处理购物车数据,比如把购物车状态提升到父组件:

  • 第一步:在父组件维护购物车状态和添加方法
    class App extends Component {
      state = {
        cartItems: []
      }
    
      addToCart = (product) => {
        // 用setState更新状态,触发组件重渲染
        this.setState(prevState => ({
          cartItems: [...prevState.cartItems, product]
        }))
      }
    
      render() {
        return (
          <View>
            {/* 把添加方法传给Product组件 */}
            <Product 
              productName="Apple" 
              productPrice="$5" 
              addToCart={this.addToCart} 
            />
            {/* 把购物车数据传给Cart组件 */}
            <Cart cartItems={this.state.cartItems} />
          </View>
        )
      }
    }
    
  • 第二步:Product组件调用props里的添加方法
    <Button 
      style={{flex:1, height:30, alignContent:'center', backgroundColor:'#8ab465'}} 
      onPress={()=>{ 
        this.props.addToCart({ 
          name:this.props.productName, 
          price:this.props.productPrice, 
        }) 
      }}
    />
    
  • 第三步:Cart组件通过props接收并渲染数据
    export default class Cart extends Component{
      render() {
        return (
          <View>
            {this.props.cartItems.map((item, idx) => (
              <Text key={idx}>{item.name} - {item.price}</Text>
            ))}
          </View>
        )
      }
    }
    

这样既解决了报错问题,又能让购物车数据变化时自动更新界面,完全符合React的设计理念。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:07:16