开发者问题收集

(ReactJS)未捕获的类型错误:无法读取未定义的属性(读取“map”)

2023-03-19
183

未捕获的类型错误:无法读取未定义的属性(读取“map”)

import React, { useState } from "react";

import products from '../products'


function RecScreen() {
  const [budget, setBudget] = useState(products);
  const [items, setParts] = useState([]);

  const handleInputChange = (event) => {
    setBudget(event.target.value);
  };

  const handleSubmit = async (event) => {
    event.preventDefault();

    const response = await fetch(`/api/products?price=${budget}`);
    const data = await response.json();

    setParts(data.product);
  };
  return (
    <div>
      <h1>PC Parts Recommender</h1>
      <form onSubmit={handleSubmit}>
        <label>
          Enter your budget:
          <input type="number" value={budget} onChange={handleInputChange} />
        </label>
        <button className='btn btn-warning rounded ms-1' type="submit">Recommend Parts</button>
      </form>
      <ul>
        {items.map(product => (
          <li key={product.id}>{product.name} - ${product.price}</li>
        ))}
      </ul>
    </div>
  );
}

export default RecScreen;

React 代码 在此代码中,用户输入预算并推荐 PC 部件,但它没有显示任何内容并给出此 未捕获的类型错误:无法读取未定义的属性(读取“map”)

2个回答

这里的问题是,属性 product 在对象 data 中不存在,但是您正在使用 data.product 更新状态 items ,而 data.productundefined ,因此当您尝试使用 items.map 通过 items 进行映射时,您正在尝试通过 undefined 值进行映射

要处理此问题,请使用此代码:

const handleSubmit = async (event) => {
  event.preventDefault();

  const response = await fetch(`/api/products?price=${budget}`);
  const data = await response.json();
  console.log(data) // see what your data object looks like
  if(data?.product){ // make this condition to only update the state when data exist and data.product exists
    setParts(data.product);
  }
};
Ahmed Sbai
2023-03-19

如果 data.product 具有虚假值,则在这种情况下它将抛出此错误,您可以像这样修改此函数

const handleSubmit = async (event) => {
    event.preventDefault();
    const response = await fetch(`/api/products?price=${budget}`);
    const data = await response.json();
    setParts(data.product || []);
  };
pinku kumar
2023-03-21