Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

useFirestoreCollection triggers a double render #484

Open
maxprilutskiy opened this issue Oct 29, 2021 · 4 comments
Open

useFirestoreCollection triggers a double render #484

maxprilutskiy opened this issue Oct 29, 2021 · 4 comments

Comments

@maxprilutskiy
Copy link
Contributor

Hi,

Seems like useFirestoreCollection always triggers unnecessary render when fetching data (suspense is on). Similar behavior is also the case for useUser.
There's a chance I'm simply using the API wrong, so please advise if so :)

Version info

React: 17.0.2

Firebase: 9.1.3

ReactFire: 4.2.0

Test case

  const q = /* whatever query */;
  const queryResults = useFirestoreCollection(q);
  console.log(queryResults);

Expected behavior

console.log is called once.

Actual behavior

console.log is called twice.

Ultimately, what I'm trying to achieve is a code similar to the one below

const queryResults = useFirestoreCollection(query);
return queryResults.data.docs.map((d) => /* render */);

that renders only once when the data is fetched (and then only when there're changes in the collection).

@jhuleatt
Copy link
Collaborator

Hi @maxprilutskiy, my first thought is that this might be Firestore first returning locally cached data, and then later returning data from the server. Does queryResults.data.metadata.fromCache (docs) flip from false to true between the first and second renders?

Also, just to check, does anything else in the ObservableStatus object (in your case queryResults) change between renders?

@matt-kinton
Copy link

I think I'm also seeing a double render for useUser as well 🙂

@maxprilutskiy
Copy link
Contributor Author

maxprilutskiy commented Jan 7, 2022

@jhuleatt Checked - nothings seems to be different. When will you guys have some time to fix this?

@ralrom
Copy link

ralrom commented Feb 7, 2022

You're getting multiple renders because Reactfire updates the status, it goes from status='loading' to status='success' or status='error'

The way I handle this is by checking the status:

const {status, data} = useFirestoreCollection(query);

if(status === 'loading') {
   return "Loading..."
}

// Render component

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants