为啥在我设置它们后获取的数据不填充状态?

Posted

技术标签:

【中文标题】为啥在我设置它们后获取的数据不填充状态?【英文标题】:Why fetched data do not populate the state after i set them?为什么在我设置它们后获取的数据不填充状态? 【发布时间】:2021-12-23 08:19:45 【问题描述】:

数据提取成功,但我的状态没有改变。

我将状态类别初始化为空 [],然后我想将其设置为我获取的数据。响应正常,可以在控制台看到数据。

这是一个对象,有一对:categories:Array(14) 这是我要找的。​​p>

const [categories,setCategories] = useState([])

useEffect(() => 
    const fetchMeals = async () => 
      const res = await fetch(
        "https://www.themealdb.com/api/json/v1/1/categories.php"
      );
      const data = await res.json();
      console.log(data.categories);      /*array (14)*/ 
      setCategories(data.categories.map((cat) => cat.strCategory));
      console.log(categories);          /*empty array*/
    ;
    fetchMeals();
  ,[]);

为什么不起作用?

【问题讨论】:

我不认为该套装可以立即使用;类别将在下一次渲染时设置。如果您在组件中显示类别,您应该会看到新值;您的代码看起来正确(尽管我会为 fetch 添加一些错误检查)。 data.category 中的对象的结构是什么?此外,setCategory 是异步的,因此您在此阶段看不到 category 状态更新。把你的console.log(categories)放在使用效果之外。 【参考方案1】:

setState 是类似异步的操作,因此您永远不会看到同步更新的状态(在调用 setState 之后)。 你也可以这样做:

const updatedCategiories = data.categories.map((cat) => cat.strCategory);
setCategories(updatedCategiories);
console.log(updatedCategiories);

【讨论】:

以上是关于为啥在我设置它们后获取的数据不填充状态?的主要内容,如果未能解决你的问题,请参考以下文章

将所有数据推送到数组后设置状态

获取 MediaPlayer 的状态

为啥我的状态在 useDispatch 后没有更新

虚拟填充猫鼬

为啥我wds连接成功后就是上不去网,啥设置都弄过了

为啥我的 Silverlight BusyIndi​​cator 在设置 IsBusy = true 后仍然不可见?