我有幾個具有不同值的按鈕,我需要用戶全部單擊它們,然后才會提供訪問權限。所以事實證明我正在使用奇怪的 if 陳述句,因為它不起作用。這是我的代碼:
export const SubscribeOnOthers: React.FC = () => {
const router = useRouter();
const [subscribed, setSubscribed] = useState<Array<string>>([]);
const [isError, setIsError] = useState<boolean>(false);
const [isSuccess, setIsSuccess] = useState<boolean>(false);
const users = [
{ nickname: "@user1" },
{ nickname: "@user2" },
{ nickname: "@user3" },
{ nickname: "@user4" },
];
const checkAllSubs = useCallback(() => {
users.map(({ nickname }) => {
if (!subscribed.includes(nickname)) {
setIsError((prev) => true);
}
});
setTimeout(() => {
if (!isError) {
console.log("all is good")
}
},1000)
}, [isError])
return (
...
)
所以我有 4 個成員,用戶必須訂閱每個成員(讓我們想想如果他點擊了,他就訂閱了) 當用戶點擊任何按鈕時,該按鈕的值正在寫入subscribed狀態。當用戶單擊名為check all subscriptions該函式checkAllSubs的按鈕時,將呼叫該函式。但是當我不是所有用戶都處于subscribed狀態時,路由器控制臺無論如何都會在 1 秒內“一切都很好”問題出在哪里
uj5u.com熱心網友回復:
我認為你應該重新考慮一下這個組件,我不明白為什么要使用 setTimeout 但無論如何, useState 不是同步的,所以它在 if 陳述句中仍然是錯誤的。相反,使用變數作為標志,而不是狀態。在這種情況下,最好的做法是使用 forEach 而不是 map,因為您沒有回傳任何陣列。
const checkAllSubs = ()=>{
let isError=false
users.forEach(({ nickname }) => {
if (!subscribed.includes(nickname)) {
IsError=true;
}
});
setTimeout(() => {
if (!isError) {
console.log("all is good")
}
},1000)
}
return (
...
)
如果你使用 useCallback 記得添加訂閱到你的依賴陣列
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/493361.html
標籤:javascript 反应
