【问题标题】:TypeError: Cannot read properties of undefined (reading 'img') when I refresh the pageTypeError:刷新页面时无法读取未定义的属性(读取“img”)
【发布时间】:2022-01-21 00:15:45
【问题描述】:

我正在使用 Redux 创建一个 React 应用程序。通过 Axios 获取数据,她正在工作。图片是使用效果

然后我将数据导入到我的一个组件中,她正在工作。

这张图片显示了如何

然后我尝试取值,调整它,然后返回一个新值 当我运行程序时它可以工作,但是当我刷新页面时,会发生错误

我的组件代码

     import React,{useState,useEffect} from 'react'
  import {useSelector} from "react-redux"
  import{Products,Filters,Cards} from  "./Styled"
   
  export  function Prodacts() {
      const [toggleFilter,setToggleFilter]=useState(false)
      const [filteredData,setFilterdData]=useState([])
      const[limitList,setLimetList]=useState(9)
      const ProductsData = useSelector(state=>state.productData)
  
  



       const handelFilter=(e)=>{
       const filter=e;
       
       if(filter==="women"){
       return setFilterdData( ProductsData.filter((e)=>filter===e.category))
       }
       else if(filter==="men"){
           return  setFilterdData(ProductsData.filter((e)=>e.category===filter))
           }
           else if(filter==="accessories"){
               return setFilterdData( ProductsData.filter((e)=>e.category===filter))
               }
               else return setFilterdData(ProductsData)
       }
       
       
       const displayProduct=()=>(
       
           <Cards>
              {
                    
           filteredData.map((e)=>(
          <div>
           <div>
           <img src={e.img} alt="img"/>
               <button>Quick View</button>
           </div>
           <div>
               <h4>{e.name}</h4>
               <span>{e.price}</span>
           </div>
           
       </div>
               )
              
            )
           }
        
           </Cards>
           
       )
       
           const updateData=()=>{
               const data=[]
           for(let i=0;i<limitList;i++){
             
           data.push(ProductsData[i])
           }
           setFilterdData(data)
           }
          
       useEffect(()=>{
           updateData()
       },[filteredData])
       
       
       
       const Filter=()=>(
        <Filters>
           <div>
               <span  onClick={()=>handelFilter("All Products")}>All Products</span>
               <span  onClick={()=>handelFilter("women")}>women</span>
               <span  onClick={()=>handelFilter("men")}>Men</span>
               <span  onClick={()=>handelFilter("accessories")}>Accessories</span>
               
           </div>
           <div>
       <button className={toggleFilter?'fas fa-times':'fas fa-filter'}>Filtter</button>
       <button className={!toggleFilter?'fas fa-search':' fas fa-times '}>Filtter</button>
           </div>
           </Filters>
           )
       
           return (
       <Products className="container">
       <h2>PRODUCT OVERVIEW</h2>
       { Filter()}
       {displayProduct()}
       </Products>
           )
       }

【问题讨论】:

  • 问题中的代码没有向您展示如何填充 filteredData,这似乎是包含具有值undefined 的元素的数组。请出示该代码。
  • 图像可能是有用的添加,但您需要将所有代码显示为文本,而不是显示为文字图片。原因:meta.stackoverflow.com/q/285551/157247您图片中的某些代码在问题中没有作为文本显示。
  • 我通过一个名为“updateData”的函数填写状态(filteredData)中的数据。看代码,不看图片,我通过useEffect运行
  • 抱歉,不知道我是怎么错过updateData的(可能是setFilterdData中缺少的e)。
  • 这个功能没有问题,问题是我刷新页面时utilusefact不起作用。代码方法我还是不确定,正在寻找解决方案

标签: javascript reactjs react-hooks use-effect


【解决方案1】:

在您显示的代码中,img 仅在一处作为属性读取,此处显示的缩进已更正:

<Cards>{
    filteredData.map((e)=>(
        <div>
            <div>
                <img src={e.img} alt="img"/>
                <button>Quick View</button>
            </div>
            <div>
                <h4>{e.name}</h4>
                <span>{e.price}</span>
            </div>
        </div>
    ))
}</Cards>

这告诉我们undefined 的值最终会成为filteredData 中的一个元素。

你设置filteredData的地方(通过setFilterdData [原文如此])都使用ProductsData。他们中的大多数人在上面使用filter,但updateData 这样做(此处显示已纠正缩进并添加了各种缺少的分号):

const updateData = () => {
    const data = [];
    for (let i = 0; i < limitList; i++) {
        data.push(ProductsData[i]);
    }
    setFilterdData(data);
};

这告诉我们正在发生两件事之一:

  1. ProductsData 中至少有一个 undefined 元素,或者
  2. updateData 中,ProductsData 中的元素少于limitList(即ProductsData.length 少于limitList)。

#1 我帮不了你,不清楚这些数据来自哪里。

但#2 似乎是一个非常可能的问题,limitList 的值比 ProductsData 中的产品更高。如果是这样,您需要尽快结束该循环:

const updateData = () => {
    const data = [];
    for (let i = 0, max = Math.min(limitList, ProductsData.length); i < max; i++) {
        data.push(ProductsData[i]);
    }
    setFilterdData(data);
};

或更简洁:

const updateData = () => {
    setFilterdData(ProductsData.slice(0, limitList));
};

...如果limitList 超出它的末尾,它也会在ProductsData 的长度处停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2022-12-16
    • 2023-02-02
    • 2021-11-26
    • 2021-11-24
    • 2021-12-20
    • 2021-11-27
    • 2022-01-21
    相关资源
    最近更新 更多