开发者问题收集

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

2021-01-07
351

我尝试通过传递索引使用 setState({index: index }) 设置新状态,但出现以下错误

“未捕获 TypeError:无法读取未定义的属性‘map’” 我正在使用 React Hooks,并且我还在使用箭头函数,我真的不明白发生了什么……

在此处输入图片描述

关于如何解决此问题有什么建议吗?

import { useState } from "react";
import "./App.css";

const App = () => {
  const [state, setState] = useState({
    products: [
      {
        _id: "1",
        title: "Shoes",
        src: [
          "https://www.upsieutoc.com/images/2020/01/07/img2.png",
          "https://www.upsieutoc.com/images/2020/01/07/img2.png",
        ],
     
      },
    ],
    index: 0,
  });

  const { products, index } = state;
  console.log("index", index);

  const handleTab = (index) => {
    console.log("index", index);
    setState({ index: index });
  };

  return (
    <div className="App">
      {products.map((item) => (
       <div className="details" key={item._id}>
          <div >
            <img src={item.src[index]} alt="" />
          </div>

          <div>
        
            <div className="thumb">
              {item.src.map((img, indx) => (
                <img
                  src={img}
                  alt="img"
                  key={indx}
                  onClick={() => handleTab(indx)}
                />
              ))}
            </div>
          </div>
        </div>
      ))}
    </div>
  );
};

export default App;

2个回答

当你 setState({ index: index }) 时,它会删除状态中的产品属性。 然后改为执行

setState({ products, index: index })
Nghi Nguyen
2021-01-07

原因是您的产品状态在 handleTap 函数中被索引状态替换。如果不包含当前状态,useState 将用新状态替换当前状态。

最好将产品状态和索引状态分开。例如:

const [products, setProducts] = useState([
  {
    _id: "1",
    title: "Shoes",
    src: [
      "https://www.upsieutoc.com/images/2020/01/07/img2.png",
      "https://www.upsieutoc.com/images/2020/01/07/img2.png",
    ],
 
  },
])
const [index, setIndex]= useState(0);

然后在您的 handleTab 函数中只需调用 setIndex 即可更新索引

Ari Firmanto
2021-01-07