我通過以下方式初始化了一個變數:
let [count_farmers, set_count_farmers] = useState(0);
我想要做的是,當一個人注冊到我的頁面時,我希望增加變數,如下所示:
let handleAddUser = (userinfo) => {
console.log("before: " count_farmers);
set_count_farmers(count_farmers 1);
console.log("after: " count_farmers);
//check if email exists @ anyone of the users, if so, don't create!
let found_user = usersVal.find((user) => userinfo.email == user.email);
if (found_user === undefined && userinfo.email.includes("@")) {
console.log(getFarmerImageByName(count_farmers % 5));
usersEditVal([
...usersVal,
{
firstname: userinfo.firstname,
lastname: userinfo.lastname,
fullname: userinfo.firstname " " userinfo.lastname,
reviews: [{ idReviewer: "", text: "" }],
location: "Tel Aviv",
likes: 0,
about:
"this is a default about textthis is a default about textthis is a default about textthis is a default aboefbout text",
likedProfilesId: [],
likedProductsId: [],
img: getFarmerImageByName(count_farmers % 5),
id: v4(),
isFarmer: userinfo.isFarmer,
password: userinfo.password,
email: userinfo.email,
farmerProducts: [],
cartProducts: [],
soldItems: [],
},
]);
return true;
} else {
console.log("EMAIL IS INVALID.");
return false;
}
//****************************************************************** */
};
現在,無論我注冊多少次,之前和之后的控制臺日志(函式 handleAddUser 中的第 1 行和第 3 行),我都會在螢屏上列印 0。
有任何想法嗎?
問候!
uj5u.com熱心網友回復:
在您的情況下,由于您使用狀態的先前值來確定新狀態,因此您需要使用 useState 函式功能,因為您的實際實作存在問題。
你可以這樣使用它:
set_count_farmers((previous) => previous 1)
這樣,我們的狀態將使用狀態本身給出的先前值進行更新,而不是我們在給定時間假設的值。那樣做會更穩定,雖然按照自己的方式做是可行的,但會導致問題。
現在,您需要知道 useState 是異步的,并且它會完成,但是您的console.log()發生太快了。
有一種簡單的方法可以useEffect()在值更改時記錄它,因為它是您想要的。
只需使用array dependencyofuseEffect()來收聽對count_farmers.
代碼應如下所示:
useEffect(() => {
console.log("A change has been detected in count_farmers: ", count_farmers)
}, [count_farmers])
這將在更新后記錄您的計數,確保您永遠不會過早登錄。
此外,您必須記住組件生命周期是如何作業的,并且每次狀態更改時都會重新渲染它。所以實際上,您也可以在每次重新呈現頁面時記錄它([] 依賴項),它也可以作業。但是,更適合收聽該特定狀態以提供更新。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/523689.html
