反应useEffect fetch - TypeError?

Posted

技术标签:

【中文标题】反应useEffect fetch - TypeError?【英文标题】:react useEffect fetch - TypeError? 【发布时间】:2021-09-09 16:06:16 【问题描述】:

这段代码有什么问题.. 在控制台上一切正常,但在我尝试使用setData(result) 将数据提取到 div 之后 我有很大的错误:

×
Unhandled Rejection (TypeError): setData is not a function
(anonymous function)
C:/blog/src/components/BlogPosts.js:19
  16 |        .then((res) => res.json())
  17 |        .then((result) => 
  18 |          console.log(result)
> 19 |          setData(result)
     | ^  20 |        )
  21 |    
  22 | 
import  useState, useEffect  from 'react'
import styles from './BlogPosts.module.css'


const BlogPosts = () => 
  const  data, setData  = useState([])

  useEffect(() => 
    const fetchData = async () => 
      fetch('https://jsonplaceholder.typicode.com/posts')
        .then((res) => res.json())
        .then((result) => 
          console.log(result)
          setData(result)
        )
    

    fetchData()
  , [])

  return (
    <section className=styles.posts>
      /* <div>
        data.map((x) => 
          return <div key=x.id>x.title</div>
        )
      </div> */
    </section>
  )


export default BlogPosts

【问题讨论】:

【参考方案1】:
 const fetchData = async () => 
      let res = null;
      fetch('https://jsonplaceholder.typicode.com/posts')
        .then((res) => res.json())
        .then((result) => 
          console.log(result)
          res = result;
        )
      return await res;
    
useEffect(async() => 
   const data = await fetchData();
   setData(data);
  , [])

【讨论】:

您能否使用上述解决方案与 const [ data, setData ] = useState([]) 状态解构。【参考方案2】:

问题出在这里:

  const  data, setData  = useState()

useState() 钩子返回一个数组,所以你应该解构一个数组

  const [ data, setData ] = useState()

P.S,将状态初始化为空数组并没有什么坏处(与没有/未定义相比,它现在是)

const [ data, setData ] = useState([])

您这样做是因为在您注释掉的代码中,您尝试使用 map() 方法,这是一种数组方法。

【讨论】:

你说得对,我不得不删除它 - 但即使使用 [] 代码也不起作用 我已经做了一个工作代码here的演示。检查你所做的是否符合它。

以上是关于反应useEffect fetch - TypeError?的主要内容,如果未能解决你的问题,请参考以下文章

使用 fetch api 反应钩子

从 api 获取时反应 useEffect 无限循环

React hooks useEffect fetch CORS 问题

用于获取数据的自定义反应钩子在第二次点击时未提供数据

使用 JSON 数据反应更新状态变量

深度反应useEffect / useEffect的使用?