单击此按钮时:
<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]);
但是为什么我点击按钮时什么也没发生呢?
1条答案
按热度按时间gr8qqesn1#
问题
你最初的尝试是正确的,这里不需要使用
useEffect
或useCallback
,你唯一缺少的是当你调用setState
时,在得到更新的值之前需要重新渲染,正如文档所说:set函数只为下一次渲染更新状态变量,如果你在调用set函数后读取状态变量,你仍然会得到调用前屏幕上的旧值。
溶液
你能做的就是在
addToCard
中调用handleprisma
,如下所示:并更改
handleprisma
,使其使用给定的card
作为参数:x一个一个一个一个x一个一个二个x