javascript - 当我更改状态值并将给状态的内容发送到 Firestore 时,状态会在 if/else 中重置为旧值
问题描述
所以我有一个搜索栏,可以为我提供用户。然后我可以单击“添加朋友”,它会变为“取消”,而该用户变为“取消”和“确认”,如果我在单个用户上尝试,一切正常。但是一旦我找到 2 个用户,第一个用户点击添加朋友工作正常,而第二个用户点击添加朋友将状态设置为取消,并立即返回到旧的“添加朋友”值,但它会将预期值添加到 firestore。然后,如果我再次单击它,它会按预期工作。
尝试将 useEffect 中的所有内容都设置为超时,但是单击后它应该显示“取消”,并且由于其他内部使用效果仍然跳回“添加朋友”。
问题是如何在不跳入旧值的情况下使其工作。
const FoundUser = ({ user }) => {
const { addFriend, peopleFound } = useData();
const [status, setStatus] = useState("Add Friend");
// if any data is found in peopleFound and coresponds to usersId that was searched for, it will set data in status state.
useEffect(() => {
peopleFound.forEach((u) => {
if (user.userId === Object.keys(u.data())[0]) {
setStatus(Object.values(u.data())[0]);
}
// without else it works fine to add several friends on first try, but for user on another end problems
// occur that if friend request was canceled it is still shown to him until rerender.
else {
setStatus("Add Friend");
console.log("1");
}
});
}, [peopleFound]);
const changeStatus = () => {
switch (status) {
case "Add Friend":
console.log("2");
setStatus("cancel");
addFriend(user.userId, "Add Friend");
break;
case "cancel":
setStatus("Add Friend");
addFriend(user.userId, "cancel");
break;
case "confirm":
setStatus("friends");
addFriend(user.userId, "friends");
break;
case "friends":
return;
}
};
return (
<div className="foundUser">
<div className="foundUser">
<UserPhoto size="30px" userPhoto={user.smallProfilePhoto} />
<h5>{user.UserName}</h5>
</div>
<div style={{ width: "max-content", marginLeft: "auto" }}>
{status === "confirm" ? (
<button
className="requestFriend"
onClick={() => {
addFriend(user.userId, "cancel");
setStatus("Add Friend");
}}
>
Cancel
</button>
) : (
<></>
)}
<button onClick={changeStatus} className="requestFriend">
{status}
</button>
</div>
</div>
);
};
export default FoundUser;
```js
解决方案
推荐阅读
- c# - 使用位置记录构造函数和/或初始化属性时如何检查参数是否为空?
- node.js - 为什么节点 14 和 16 的 AzureDevOps 私有 NPM 存储库如此缓慢?
- python - 将一个列表中的值(在 dict 中)与另一个列表进行比较 [Python]
- linux - 如何在 UNIX/LINUX 中特定行的末尾添加字符?
- c# - 无法使用凭证从 C# 控制台应用程序连接到 IBM MQ
- javascript - 推杆在 30 秒后断开
- css - prefers-color-scheme:dark 不会从 SCSS 编译为 CSS 样式表
- haskell - 我可以教 GHC 数学归纳法吗?
- php - Wordpress 中 CPT 的分层分类和永久链接返回 404
- r - 带有ggplot的for循环-rep_len(TRUE,nrow(x))中的错误:无效的'length.out'值