开发者问题收集

useEffect 可以等待 setState(hook) 吗?

2019-09-24
77

我在 useEffect 中有一个代码(如 componentDidMount):

useEffect(()=>{
    const idChat = props.match.params.id;
    const data = {
      idChat,
      user: props.user._id
    }
    authService.getChat(data)
    .then(res =>{
      const userChat = res.data.users.filter(e=> e!== data.user).toString()
      authService.getuser(userChat)
      .then(res=>{
        setOtherUser(res.data)
      })
    })
    .catch(err=>{
      setErrors(err.response)
    })

  }, [])

此代码运行一次。好的。

我需要另一个使用 otherUser 状态的 useEffect。但它尚未设置。

useEffect(()=>{
  socket.readUsers(users => {
    const is = users.users.indexOf(otherUser._id);
    console.log(users,otherUser._id, is)
    if(is < 0){
      setUsersStatus(false)
    }else{
      setUsersStatus(true)
    }
  });
 })

如果我执行条件,则永远不会进入 if :/ 如何在 useEffect 中调用 otherUser?

2个回答

将其添加为效果的依赖项。这样,当未设置 otherUser 时,您就可以跳过执行代码。

useEffect(() => {
  if (otherUser) {
    socket.readUsers(users => {
      const is = users.users.indexOf(otherUser._id);
      console.log(users, otherUser._id, is);
      if (is < 0) {
        setUsersStatus(false);
      } else {
        setUsersStatus(true);
      }
    });
  }
}, [otherUser]);
Jap Mul
2019-09-24

添加 otherUser 用户作为此形状,并将 otherUser 的依赖项作为第二个参数 arry[otherUser]

useEffect(()=>{
if(otherUser){....}
},[otherUser])
Mohammed Al-Reai
2019-09-24