tqf
Version:
React Query hooks for Firebase.
193 lines (154 loc) • 4.88 kB
text/mdx
---
title: Data Mutation | Realtime Database
description: Hooks for integrating with Realtime Database.
---
This page information on how you can mutate data on the Realtime Database, such as
updating, deleting and or running transactions.
All hooks are built upon the [`useMutation`](https://react-query.tanstack.com/reference/useMutation)
hook, making it super simple to handle loading states, success and errors.
To set data in the database, use the `useDatabaseSetMutation` hook.
```jsx
import { useDatabaseSetMutation } from "@react-query-firebase/database";
import { ref } from "firebase/database";
import { database } from "./firebase";
function UpdateUser({ id }) {
const dbRef = ref(database, `users/${id}`);
const mutation = useDatabaseSetMutation(dbRef);
return (
<>
<button
disabled={mutation.isLoading}
onClick={() => {
mutation.mutate({
name: "John Doe",
});
}}
>
Update User
</button>
{mutation.isError && <p>{mutation.error.message}</p>}
</>
);
}
```
To set data with priority, provide the `priority` option to the hook:
```js
const mutation = useDatabaseSetMutation(dbRef, {
priority: "high",
});
```
This will set data on the entire node, overriding anything which existed before. If you want to only set
a sub-value on a node, provide a tighter reference instead:
```js
const dbRef = ref(database, `user/123/name`);
const mutation = useDatabaseSetMutation(dbRef);
mutation.mutate("John Doe");
```
To update data in the database, use the `useDatabaseUpdateMutation` hook.
Instead of taking the raw values of the node, you instead provide the child path to a node as the object key
with the value to update.
```jsx
import { useDatabaseUpdateMutation } from "@react-query-firebase/database";
import { ref } from "firebase/database";
import { database } from "./firebase";
function UpdateUser({ id }) {
const dbRef = ref(database, `users/${id}`);
const mutation = useDatabaseUpdateMutation(dbRef);
return (
<>
<button
disabled={mutation.isLoading}
onClick={() => {
mutation.mutate({
name: "John Doe",
"address/line1": "Mountain View",
});
}}
>
Update User
</button>
{mutation.isError && <p>{mutation.error.message}</p>}
</>
);
}
```
In this example, the mutation will update the `users/:id/name` and `users/:id/address/line1` nodes
at the same time.
To remove data in the database, use the `useDatabaseRemoveMutation` hook.
```jsx
import { useDatabaseUpdateMutation } from "@react-query-firebase/database";
import { ref } from "firebase/database";
import { database } from "./firebase";
function UpdateUser({ id }) {
const dbRef = ref(database, `users/${id}/address`);
const mutation = useDatabaseRemoveMutation(dbRef);
return (
<>
<button
disabled={mutation.isLoading}
onClick={() => {
mutation.mutate();
}}
>
Remove User Address
</button>
{mutation.isError && <p>{mutation.error.message}</p>}
</>
);
}
```
In this example, the `users/:id/address` node will be removed. Any subscribers of this data will return `null`
as the value once complete.
To perform a database transaction, use the `useDatabaseTransaction` hook. You can learn more
by viewing the [Firebase Transaction documentation](https://firebase.google.com/docs/database/web/read-and-write#save_data_as_transactions).
```jsx
import { useDatabaseTransaction } from "@react-query-firebase/database";
import { ref } from "firebase/database";
import { database } from "./firebase";
function LikePost({ id }) {
const dbRef = ref(db, "post/123");
const mutation = useDatabaseTransaction(dbRef, (post) => {
if (post) {
post.likes++;
}
return post;
});
return (
<>
<button
disabled={mutation.isLoading}
onClick={() => {
mutation.mutate();
}}
>
Like Post!
</button>
{mutation.isError && <p>{mutation.error.message}</p>}
</>
);
}
```
If you wish to get the result of the transaction (a [`TransactionResult`](https://firebase.google.com/docs/reference/js/database.transactionresult)),
either await the mutation or wait for it to be successful:
```js
const dbRef = ref(db, "post/123");
const mutation = useDatabaseTransaction(dbRef, (post) => {
if (post) {
post.likes++;
}
return post;
});
// Option 1: Await the mutation
const transactionResult = await mutation.mutateAsync();
// Option 2: Wait for success
if (mutation.isSuccess) {
const transactionResult = mutation.data;
console.log(transactionResult.committed);
console.log(transactionResult.snapshot);
}
```