Firebase Realtime Database
Firebase Realtime Database is a cloud-hosted NoSQL database that lets you store and sync data between your users in realtime.
Before using these hooks, ensure your Firebase project has Realtime Database enabled and your app is initialized with a Database instance.
Setup
import { initializeApp } from "firebase/app";
import { getDatabase } from "firebase/database";
// Initialize your Firebase app
initializeApp({ ... });
// Get the Realtime Database instance
const database = getDatabase(app);
Importing
Hooks are exported from the database namespace:
import { useOnValueQuery } from "@tanstack-query-firebase/react/database";
Hooks accept DatabaseReference / Query values from ref() / query() and the Database instance from getDatabase() (obtained at app init, not wrapped by these hooks).
One-time reads
Use useGetQuery when you need a single read without a realtime listener:
import { ref } from "firebase/database";
import { useGetQuery } from "@tanstack-query-firebase/react/database";
function UserProfile({ uid }: { uid: string }) {
const userRef = ref(database, `users/${uid}`);
const { data: snapshot, isLoading, isError, error } = useGetQuery(userRef, {
queryKey: ["database", "users", uid],
});
if (isLoading) return <p>Loading...</p>;
if (isError) return <p>Error: {error.message}</p>;
return <p>{snapshot?.val()?.name}</p>;
}
Realtime listeners
Use listener hooks such as useOnValueQuery and the useOnChild* hooks to subscribe to Realtime Database events. The first snapshot resolves the query; later snapshots update the TanStack Query cache.
import { ref } from "firebase/database";
import { useOnValueQuery } from "@tanstack-query-firebase/react/database";
function LiveScoreboard({ gameId }: { gameId: string }) {
const scoreRef = ref(database, `games/${gameId}/score`);
const { data: snapshot } = useOnValueQuery(scoreRef, {
queryKey: ["database", "onValue", "games", gameId, "score"],
});
return <p>Score: {snapshot?.val() ?? 0}</p>;
}
Pass Firebase ListenOptions via the database option (for example { onlyOnce: true }):
useOnValueQuery(scoreRef, {
queryKey: ["database", "onValue", "games", gameId, "score"],
database: { onlyOnce: true },
});
Components sharing the same queryKey share one TanStack Query cache entry. Use a stable, unique queryKey per path to avoid duplicate Firebase listeners.
Mutations
Write hooks follow the same pattern as other TanStack Query Firebase modules. Pass a DatabaseReference when creating the hook, then call mutate with the payload:
import { ref } from "firebase/database";
import { useSetMutation } from "@tanstack-query-firebase/react/database";
function UpdateUser({ uid }: { uid: string }) {
const userRef = ref(database, `users/${uid}`);
const { mutate, isPending } = useSetMutation(userRef);
return (
<button
disabled={isPending}
onClick={() => mutate({ name: "Ada", score: 1 })}
>
Save
</button>
);
}
Connection and on-disconnect hooks
useGoOnlineMutation/useGoOfflineMutationaccept aDatabaseinstance to control client connectivity.useOnDisconnect*hooks queue writes that run when the client disconnects from the Realtime Database server.
Queries
useGetQuery— one-time read viagetuseOnValueQuery— subscribe to value changesuseOnChildAddedQuery— subscribe tochild_addeduseOnChildChangedQuery— subscribe tochild_changeduseOnChildMovedQuery— subscribe tochild_moveduseOnChildRemovedQuery— subscribe tochild_removed
Mutations
useSetMutation— replace data at a locationuseUpdateMutation— multi-path updateuseRemoveMutation— delete datausePushMutation— append with an auto-generated keyuseRunTransactionMutation— atomic read-modify-writeuseSetPriorityMutation— set node priorityuseSetWithPriorityMutation— write value and priority togetheruseGoOnlineMutation— reconnect to the serveruseGoOfflineMutation— disconnect from the serveruseOnDisconnectSetMutation— queue a disconnectsetuseOnDisconnectUpdateMutation— queue a disconnectupdateuseOnDisconnectRemoveMutation— queue a disconnectremoveuseOnDisconnectCancelMutation— cancel queued disconnect operationsuseOnDisconnectSetWithPriorityMutation— queue a disconnectsetWithPriority