Components
FirebaseDatabaseTransaction
Place a FirebaseDatabaseProvider
component at the top level of your app (anywhere as long as it's above the other Realtime Database components).
Copy import { FirebaseDatabaseProvider } from '@react-firebase/database'
// Before
const App = () => {
return <div>
This is my app
</div>
}
// After
const App = () => {
return (
<FirebaseDatabaseProvider>
<div>
This is my app
</div>
</FirebaseDatabaseProvider>
)
}
If you need to authenticate to access your data, check out @react-firebase/auth
Firebase Database Node
Check API for a list of supported props.
Read data from Firebase example
Copy <React.Fragment>
<FirebaseDatabaseNode path="user_bookmarks/" limitToFirst={2}>
{d => {
return <pre>{JSON.stringify(d, null, 2)}</pre>;
}}
</FirebaseDatabaseNode>
<FirebaseDatabaseNode path="maximes/-L8m-aeCHQO7qtMVvUfMa">
{d => {
return d.isLoading === true ? (
"Loading"
) : (
<pre>{JSON.stringify(d, null, 2)}</pre>
);
}}
</FirebaseDatabaseNode>
</React.Fragment>
Firebase Database Mutation
The FirebaseDatabaseMutation
allows you to render components that run Firebase mutations (update, set, push).
A setMutation
function that returns a promise is provided to the children function.
FirebaseDatabaseMutation needs 3 props :
operation : "update" | "set" | "push"
children:
(
{
runMutation: (value:any) => Promise<{key?:string}>
}
) => ReactNode
Write data to Firebase example
Copy <FirebaseDatabaseMutation
type="update"
path="user_bookmarks/a"
>
{({ runMutation }) => {
return (
<div>
<button
onClick={() => {
runMutation({
new_data: `Oh hai again ${Date.now()}`,
updated_at: firebase.database.ServerValue.TIMESTAMP
}).then(() => {
console.log("Ran mutation");
});
}}
>
Click me to run mutation
</button>
</div>
);
}}
</FirebaseDatabaseMutation>
Firebase Database Transaction
Suppose you have a shared counter that many can increment. To avoid race conditions, use transactions.
FirebaseDatabaseTransaction needs 2 props:
children:
(
{
runTransaction: ({ reducer: (value:any)=>any }) => Promise<{key?:string}>
}
) => ReactNode
Firebase Transaction Example
Copy <FirebaseDatabaseTransaction path="user_bookmarks/a/usage_count">
{({ runTransaction }) => {
return (
<div>
<button
onClick={() => {
runTransaction({
reducer: val => {
if (val === null) {
return 1;
} else {
return val + 1;
}
}
}).then(() => {
console.log("Ran transaction");
});
}}
>
Click me to run transaction
</button>
</div>
);
}}
</FirebaseDatabaseTransaction>;
Complete Example
Copy import firebase from "firebase/app";
import "firebase/database";
import {
FirebaseDatabaseProvider,
FirebaseDataNode
} from "react-firebase-database";
import ReactJson from "react-json-view";
const MyApp = () => {
return (
<FirebaseDatabaseProvider {...config} firebase={firebase}>
<div>hai</div>
<FirebaseDatabaseNode path="user_bookmarks/" limitToFirst={1}>
{d => {
return d.isLoading === true ? "Loading" : <ReactJson src={d} />;
}}
</FirebaseDatabaseNode>
<FirebaseDatabaseNode path="user_bookmarks/a">
{d => {
return <ReactJson src={d} />;
}}
</FirebaseDatabaseNode>
<FirebaseDatabaseMutation
type="set"
path="user_bookmarks/a"
value={{
new_data: "Oh hai",
updated_at: firebase.database.ServerValue.TIMESTAMP
}}
>
{({ runMutation }) => {
return (
<div>
<button
onClick={() => {
runMutation({
newData: `Hi ${Date.now()}`,
updated_at: firebase.database.ServerValue.TIMESTAMP
}).then(() => {
console.log("Ran mutation");
});
}}
>
Click me to run mutation
</button>
</div>
);
}}
</FirebaseDatabaseMutation>
<FirebaseDatabaseTransaction path="user_bookmarks/a/usage_count">
{({ runTransaction }) => {
return (
<div>
<button
onClick={() => {
runTransaction({
reducer: val => {
if (val === null) {
return 1;
} else {
return val + 1;
}
}
}).then(() => {
console.log("Ran transaction");
});
}}
>
Click me to run transaction
</button>
</div>
);
}}
</FirebaseDatabaseTransaction>
</FirebaseDatabaseProvider>
);
};