简体   繁体   English

React:React-Firebase-Hooks 没有获得价值

[英]React: React-Firebase-Hooks not getting value

I am using this package React-Firebase-Hooks but I am not very sure how to properly use it.我正在使用这个 package React-Firebase-Hooks但我不太确定如何正确使用它。

In my code below, user.data().username is shown correctly but after putting it in useState , the username is not shown.在我下面的代码中, user.data().username显示正确,但将其放入useState后,用户名未显示。 What was not done correctly here?这里没有正确完成什么?

const [user, loading, error] = useDocument(
  firebase.firestore().collection("users").doc(uid),
  {
    snapshotListenOptions: { includeMetadataChanges: true },
  }
);

const [username, setUsername] = useState(user && user.data().username);

return (
  <div className="flex">
    <div className="w-1/2">
      {user && (
        <div className="p-8">
          <div>{user.data().username}</div>
          <div>{username}</div>
        </div>
      )}
    </div>
    <div className="w-1/2">Box 2</div>
  </div>
);

The reason you are not getting the value on state because when the useState is initialized, user doesn't has a value, it's still loading.您没有在 state 上获得值的原因是因为初始化useState时, user没有值,它仍在加载。 Since state is initialized only once, when the data from firebase loads, state doesn't changes.由于 state 仅初始化一次,因此当来自 firebase 的数据加载时,state 不会更改。
You need to use a useEffect hook to watch for change in user, and setUsername then.您需要使用setUsername挂钩来观察用户的变化,然后设置用户名。

const [user, loading, error] = useDocument(
  firebase.firestore().collection("users").doc(uid),
  {
    snapshotListenOptions: { includeMetadataChanges: true },
  }
);

const [username, setUsername] = useState('');

useEffect(() => {
  if (user) {
    setUsername(user.data().username);
  }
}, [user])

return (
  <div className="flex">
    <div className="w-1/2">
      {user && (
        <div className="p-8">
          <div>{user.data().username}</div>
          <div>{username}</div>
        </div>
      )}
    </div>
    <div className="w-1/2">Box 2</div>
  </div>
);

This should work, if you face any issues, leave a comment.这应该有效,如果您遇到任何问题,请发表评论。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM