reactjs 一个函数中的更新状态与另一个函数中的更新状态不同步,而另一个函数将更新状态发送到API

ogsagwnx  于 2023-03-17  发布在  React
关注(0)|答案(1)|浏览(140)

单击此按钮时:

<Button
  onClick={(e) => {
    addToCard(item);
    handleprisma();
  }}
>
  add to cart
</Button>

此函数要将项目添加到我的卡中:

const addToCard = (item) => {
    const newCard = {
      fff: "1",
      ddd:  "2",
      aa: "3",
      dfdfdf:  "4",
      asdf:  "5",
      teest:  "6",
    
    };
    context.setcount(context.count + 1);
    context.setcard((prev) => [...prev, newCard]);
  };

这个人想把它发到我的数据库里:

const testtt= context.card;
  async function handleprisma() {
    const res = await axios.post('/api/Me', {
      testtt,
    });
    console.log(res.data);
  }

默认情况下,该卡的值为[],因此我认为当我单击该按钮时,它不会运行addToCard!但在数据库中第二次单击时,我看到第一次单击时应创建的阵列在那里,当我再次单击时,我看到第二次单击时应创建的阵列在那里。
我用这个解决了这个问题:

useEffect(() => {
    if (context.card.length !== 0) {
      handleprisma();
    }
   
  }, [addToCard]);

因此,当我有1项在我的卡,如果我刷新页面,3或4个新的副本相同的东西将创建在数据库中,所以我怎么能只是停止获得这些副本?
我想使用useCallback来解决这个问题,所以我将useEffect转换为:

useCallback(() => {
    if (context.card.length !== 0) {
      handleprisma();
    }
    console.log('sfd');
  }, [addToCard]);

以及:

useCallback(() => {
    if (context.card.length !== 0) {
      handleprisma();
    }
    console.log('sfd');
  }, [context.card]);

但是为什么我点击按钮时什么也没发生呢?

gr8qqesn

gr8qqesn1#

问题

你最初的尝试是正确的,这里不需要使用useEffectuseCallback,你唯一缺少的是当你调用setState时,在得到更新的值之前需要重新渲染,正如文档所说:
set函数只为下一次渲染更新状态变量,如果你在调用set函数后读取状态变量,你仍然会得到调用前屏幕上的旧值。

溶液

你能做的就是在addToCard中调用handleprisma,如下所示:

const addToCard = (item) => {
  const newCard = {
    //...
  };
  context.setcount(context.count + 1);
  context.setcard((prev) => [...prev, newCard]);
  // 👇🏽 pass the data as parameter
  handleprisma([...context.card, newCard]);
};

并更改handleprisma,使其使用给定的card作为参数:
x一个一个一个一个x一个一个二个x

相关问题