useReFetch 不是函数或其返回值不可迭代

问题描述 投票:0回答:1
import { useRef, useState, useEffect } from 'react'

function useReFetch(url, interval){   const [data,setData]=useState(null);   const [loading,setloading]=useState(true);   const [error,seterror]=useState(null);   let timeRef=useRef(null)   async function fetchdata(){
    setloading(true);
    try{
    const resp=await fetch(url);
    const result=await resp.json();
    setData(result);}
    catch(error){
      seterror(error);
    }finally{
      setloading(false);
    }


  }

  useEffect(()=>{
    fetchdata();
    if(interval!==null){
    timeRef.current=setInterval(fetchdata,interval);
    return()=>{
      clearInterval(timeRef);
    }   }
  
    
    

  },[url,interval])   return {data,error,loading};


} function App(){   const [url,seturl]=useState("https://jsonplaceholder.typicode.com/todos/1")  const [data,error,loading]=useReFetch(url,5000);   return <div>
    
    <h1>{data}</h1>


  </div>

} export default App;

用于从后端一次又一次重新获取详细信息的自定义挂钩,当我尝试在浏览器中打开它时,它会显示此错误 --useReFetch 不是函数或其返回值不可迭代

reactjs react-hooks
1个回答
0
投票

您的代码存在几个问题。第一个是如何从

useReFetch
自定义挂钩返回数据以及如何从
App
组件中的自定义挂钩检索数据。您返回一个带有
{ data, error, loading }
的对象,但是您将
useRefetch()
钩子解构为数组,这就是您收到该错误的原因。相反,您应该按如下方式解构您的
useRefetch
钩子:

const { data, error, loading } = useReFetch(url, 5000);   

此外,您不需要将 url 放在状态变量中。这是非常没有必要的,因为 url 状态不会改变。相反,您应该将网址直接传递到您的

useRefetch()
钩子:

 const { data, error, loading } = useReFetch("https://jsonplaceholder.typicode.com/todos/1, 5000);

此外,您的 api 端点返回单个对象数据,并且您将其直接渲染到 JSX 中。在这种情况下,React 将抛出错误。相反,您可能应该只定位返回数据的属性之一,如下所示:

function App(){   
//The rest of your state
  return (
    <div>
      <h1>{data.title}</h1>
    </div>
  )

} 

如果您想查看整个数据集的结构,您可以按如下方式对对象进行字符串化:

function App(){   
//The rest of your state
  return (
    <div>
      <h1>{JSON.stringify(data)}</h1>
    </div>
  )

} 
© www.soinside.com 2019 - 2024. All rights reserved.