开发者问题收集

未捕获的类型错误:无法读取未定义的属性(读取‘id’)

2022-05-11
24374

我得到未定义的结果,因为 cartitems 中的 item 不是未定义的,我该如何修复它?

1.

import React,{useState} from 'react'
import {products} from './data'

function app() {
  const [cartitems, setCartitems] = useState([])

  const onAddToCart = (product)=>{

    const exist = cartitems.find((item)=> {
        return product.id == item.id
    })

    if(exist){
      setCartitems(cartitems.map((item)=>{
        item.id == product.id ? {...exist, qnty: exist.qnty + 1}: item
      }))
    }
    else{
      setCartitems([...cartitems, {...product, qnty: 1}])

    }
  }

  return (
    <div>
      {products.map((product)=>(
              <div key={product.id}>
      <img src={product.image} style=         {{width:"200px"}}/>
      <p>{product.name}</p>
      <button onClick={() => onAddToCart(product)}>Add To Cart</button>
    </div>
      ))}
    </div>
  )
}

export default app
export const products = [
    {
        id: '1',
        name: 'MacBook',
        price: 1400,
        image: 'https://picsum.photos/id/180/2400/1600',
      },
      {
        id: '2',
        name: 'Old Car',
        price: 2400,
        image: 'https://picsum.photos/id/111/4400/2656',
      },
      {
        id: '3',
        name: 'W Shoes',
        price: 1000,
        image: 'https://picsum.photos/id/21/3008/2008',
      },
]
3个回答

这可以解决您的问题:

1- 您没有从 map 返回任何内容

2- 最好在 cartitems 的设置状态下使用函数类型

function app() {
  const [cartitems, setCartitems] = useState([])

  const onAddToCart = (product)=>{

    const exist = cartitems.find((item)=> {
        return product.id == item.id
    })

    if(exist){
      setCartitems(cartitems.map((item)=>
        item.id == product.id ? ({...exist, qnty: exist.qnty + 1}): item
      ))
    }
    else{
      setCartitems(s=>[...s, {...product, qnty: 1}])

    }
  }
shahrooz bazrafshan
2022-05-11

问题

在初始渲染中,您尝试访问不存在的属性。 换句话说,在初始渲染中,您的 products 是一个空数组

解决方案

使用短路

{products &&
            products.map((product) => (
              <div key={product.id}>
                <img src={product.image} style={{ width: "200px" }} />
                <p>{product.name}</p>
                <button onClick={() => onAddToCart(product)}>
                  Add To Cart
                </button>
              </div>
            ))}
Amr
2022-05-11

问题是:您未在 .map 中返回任何内容。这就是您获得 undefined 的原因。

setCartitems(cartitems.map((item)=>{
   item.id == product.id ? {...exist, qnty: exist.qnty + 1}: item
}))

只需删除 {

setCartitems(cartitems.map((item)=>
   item.id == product.id ? {...exist, qnty: exist.qnty + 1}: item
))

或者明确添加 return

cartitems.map(item => {
    if (item.id == product.id) {
      return { ...exist, qnty: exist.qnty + 1 }
    }
    
    return item
  })
Georgy
2022-05-11