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.
import { initializeApp } from "firebase/app";
import { getDatabase } from "firebase/database";
// Initialize your Firebase app
initializeApp({ ... });
// Get the Realtime Database instance
const database = getDatabase(app);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).
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>;
}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.
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>
);
}useGoOnlineMutation/useGoOfflineMutationaccept aDatabaseinstance to control client connectivity.useOnDisconnect*hooks queue writes that run when the client disconnects from the Realtime Database server.
useGetQuery— one-time read viagetuseOnValueQuery— subscribe to value changesuseOnChildAddedQuery— subscribe tochild_addeduseOnChildChangedQuery— subscribe tochild_changeduseOnChildMovedQuery— subscribe tochild_moveduseOnChildRemovedQuery— subscribe tochild_removed
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