你好,我是新手. 我发现了我朋友用useState而不是useEffect来获取API的代码. 我试过了,它起作用了,代码没有导致错误和无限循环.

以下是代码的代码

import { useState } from "react";
import { IN_THEATER, POSTER } from "../../../constant/movies";
import { GlobalGet } from "../../../utilities/fetch";

const Service = () => {
  const [movieData, setMovieData] = useState({ data: null, poster: null });

  const fetchMovieData = async () => {
    try {
      let movieRes = await GlobalGet({ url: `${IN_THEATER}` });
      return movieRes;
    } catch (error) {
      console.log(error);
    }
  };

  const fetchPoster = async () => {
    try {
      let posterRes = await GlobalGet({ url: `${POSTER}` });
      return posterRes;
    } catch (error) {
      console.log(error);
    }
  };

  const fetchData = async () => {
    setMovieData({
      data: await fetchMovieData(),
      poster: await fetchPoster(),
    });
  };

  useState(() => { //<=here it is
    fetchData();
  }, []);
  return {
    movieData,
  };
};

export default Service;

我的问题是,为什么会发生这种情况?为什么在那里使用useState不会导致无限循环?

推荐答案

useState()函数可以接受initializer函数作为其第一个参数:

const [state, setState] = useState(initializerFunction)

当一个函数被传递给useState()时,该函数在组件最初挂载之前只被调用一次.在下面的例子中,初始化式函数是一个匿名箭头函数:

useState(() => { // <-- Initializer function invoked once
  fetchData();
}, []);

在这里,初始化式函数是() => { fetchData(); },它在初始挂载之前被调用一次,因此fetchData()方法只被调用一次.作为第二个参数[]传递的数组是无用的,在本例中不做任何事情,因为useState()忽略了它.如果您使用useState(fetchData);,上面的useState的行为将相同.因为fetchData()在初始挂载时只被调用一次,所以组件的任何状态更新都不会导致fetchData()函数再次执行,因为它在初始化器函数中.

也就是说,useState()不应该用于获取组件挂载上的数据,而应该使用useEffect().

Javascript相关问答推荐

当我使用jQuery时,我的图标显示为[对象对象]

在JavaScript中打开和关闭弹出窗口

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

如何使用Echart 5.5.0创建箱形图

TypScript界面中的Infer React子props

判断表格单元格中是否存在文本框

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

自定义高图中的x轴标签序列

为什么!逗号和空格不会作为输出返回,如果它在参数上?

在拖放时阻止文件打开

如何在coCos2d-x中更正此错误

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

未加载css colored颜色 ,无法将div设置为可见和不可见

为什么客户端没有收到来自服务器的响应消息?

元素字符串长度html

触发异步函数后不能显示数据

为什么当我更新数据库时,我的所有组件都重新呈现?

如何防止ionic 输入中的特殊字符.?

构建器模式与参数对象输入