首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从React Hook复制数组

从React Hook复制数组
EN

Stack Overflow用户
提问于 2019-12-30 04:40:45
回答 4查看 169关注 0票数 1

我使用useState钩子来填充数组中的项。

代码语言:javascript
代码运行次数:0
运行
复制
const [meals, setMeals] = useState([]);
useEffect(async () =>{
    const mealsData = await fetchMeals(localStorage.getItem('user_id'));
    console.log(mealsData);// Array(3)
    setMeals([...meals, mealsData]);
    console.log(meals);//[]
 }, []);

这个数组在我的setMeals方法中没有拷贝,我在这里做错了什么?

EN

回答 4

Stack Overflow用户

发布于 2019-12-30 04:46:18

这是因为

代码语言:javascript
代码运行次数:0
运行
复制
setMeals([...meals, mealsData]);

是一个异步调用,并且在确定状态实际更新之前记录了meals

代码语言:javascript
代码运行次数:0
运行
复制
console.log(meals);

您应该在另一个useEffect()调用中调用和检查console.log()函数,该调用在每次状态更改时运行,并确保状态确实发生了更改

代码语言:javascript
代码运行次数:0
运行
复制
useEffect(() => {
    console.log(meals);
 }, [meals]);

作为第二个参数传递的[meals]将让这个useEffect()在每次meals (实际上)更新时运行。

票数 3
EN

Stack Overflow用户

发布于 2019-12-30 04:48:10

更新是异步的,新值并不像您期望的那样立即可用。你可以在这里找到更深入的解释:useState set method not reflecting change immediately

票数 0
EN

Stack Overflow用户

发布于 2019-12-30 04:52:25

UseEffect不能是异步的,您应该将其包装在异步函数中

代码语言:javascript
代码运行次数:0
运行
复制
function useMeals() {
   const [meals, setMeals] = useState([]);
    useEffect(() => {
      async function setFetchedMeals() {
        const mealsData = await fetchMeals(localStorage.getItem('user_id'));
        setMeals([...meals, mealsData]);
      }
      setFetchedMeals();
    }, []); // letting the dependency array empty will run the effect only once

  console.log(meals)
  return meals;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59523094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档