Convert Figma logo to code with AI

FirebaseExtended logoreactfire

Hooks, Context Providers, and Components that make it easy to interact with Firebase.

3,571
403
3,571
54

Top Related Projects

Firebase Javascript SDK

🔥 A well-tested feature-rich modular Firebase implementation for React Native. Supports both iOS & Android platforms for all Firebase services.

Redux bindings for Firebase. Includes React Hooks and Higher Order Components.

React Hooks for Firebase.

🔥 A collection of Firebase plugins for Flutter apps.

Quick Overview

ReactFire is an official library that provides React components and hooks for easy integration with Firebase services. It simplifies the process of using Firebase in React applications, offering a declarative approach to handle authentication, real-time database operations, and other Firebase features.

Pros

  • Seamless integration with React and Firebase
  • Provides hooks and components for easy state management
  • Supports real-time updates out of the box
  • Reduces boilerplate code for common Firebase operations

Cons

  • Limited documentation and examples for advanced use cases
  • Dependency on Firebase ecosystem may limit flexibility
  • Learning curve for developers new to Firebase concepts
  • May introduce unnecessary complexity for simple applications

Code Examples

  1. Using the useSigninCheck hook for authentication:
import { useSigninCheck } from 'reactfire';

function AuthenticationStatus() {
  const { status, data: signInCheckResult } = useSigninCheck();

  if (status === 'loading') {
    return <span>Loading...</span>;
  }

  if (signInCheckResult.signedIn === true) {
    return <span>You're signed in!</span>;
  } else {
    return <span>You're not signed in.</span>;
  }
}
  1. Using the useFirestore hook to fetch data:
import { useFirestore, useFirestoreCollectionData } from 'reactfire';

function TodoList() {
  const firestore = useFirestore();
  const todosCollection = firestore.collection('todos');
  const { status, data: todos } = useFirestoreCollectionData(todosCollection);

  if (status === 'loading') {
    return <span>Loading...</span>;
  }

  return (
    <ul>
      {todos.map((todo) => (
        <li key={todo.id}>{todo.text}</li>
      ))}
    </ul>
  );
}
  1. Using the FirebaseAppProvider component to initialize Firebase:
import { FirebaseAppProvider } from 'reactfire';

const firebaseConfig = {
  // Your Firebase configuration object
};

function App() {
  return (
    <FirebaseAppProvider firebaseConfig={firebaseConfig}>
      {/* Your app components */}
    </FirebaseAppProvider>
  );
}

Getting Started

  1. Install ReactFire and Firebase:

    npm install reactfire firebase
    
  2. Wrap your app with FirebaseAppProvider:

    import { FirebaseAppProvider } from 'reactfire';
    import { initializeApp } from 'firebase/app';
    
    const firebaseConfig = {
      // Your Firebase configuration
    };
    
    const app = initializeApp(firebaseConfig);
    
    function App() {
      return (
        <FirebaseAppProvider firebaseApp={app}>
          {/* Your app components */}
        </FirebaseAppProvider>
      );
    }
    
  3. Use ReactFire hooks in your components:

    import { useFirestore, useFirestoreCollectionData } from 'reactfire';
    
    function MyComponent() {
      const firestore = useFirestore();
      const { status, data } = useFirestoreCollectionData(firestore.collection('items'));
    
      // Render your component using the data
    }
    

Competitor Comparisons

Firebase Javascript SDK

Pros of firebase-js-sdk

  • More comprehensive and flexible, covering all Firebase services
  • Can be used with any JavaScript framework or vanilla JS
  • Regularly updated with new Firebase features and improvements

Cons of firebase-js-sdk

  • Steeper learning curve for React developers
  • Requires more boilerplate code for React integration
  • Lacks React-specific optimizations and hooks

Code Comparison

reactfire:

import { useFirestore, useFirestoreCollectionData } from 'reactfire';

function TodoList() {
  const firestore = useFirestore();
  const todosCollection = firestore.collection('todos');
  const { data: todos } = useFirestoreCollectionData(todosCollection);

  return <ul>{todos.map(todo => <li key={todo.id}>{todo.text}</li>)}</ul>;
}

firebase-js-sdk:

import { useEffect, useState } from 'react';
import { getFirestore, collection, onSnapshot } from 'firebase/firestore';

function TodoList() {
  const [todos, setTodos] = useState([]);
  useEffect(() => {
    const db = getFirestore();
    const unsubscribe = onSnapshot(collection(db, 'todos'), snapshot => {
      setTodos(snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })));
    });
    return () => unsubscribe();
  }, []);

  return <ul>{todos.map(todo => <li key={todo.id}>{todo.text}</li>)}</ul>;
}

🔥 A well-tested feature-rich modular Firebase implementation for React Native. Supports both iOS & Android platforms for all Firebase services.

Pros of react-native-firebase

  • Specifically designed for React Native, offering native Firebase integration
  • Comprehensive support for various Firebase services, including Analytics and Crashlytics
  • Active community and frequent updates

Cons of react-native-firebase

  • Limited to React Native development, not suitable for web-based React projects
  • Steeper learning curve due to more complex setup and configuration
  • Larger bundle size compared to reactfire

Code Comparison

reactfire:

import { useFirestore, useFirestoreCollectionData } from 'reactfire';

function App() {
  const firestore = useFirestore();
  const usersCollection = firestore.collection('users');
  const { data: users } = useFirestoreCollectionData(usersCollection);
}

react-native-firebase:

import firestore from '@react-native-firebase/firestore';

function App() {
  const [users, setUsers] = useState([]);
  useEffect(() => {
    const subscriber = firestore().collection('users').onSnapshot(querySnapshot => {
      setUsers(querySnapshot.docs.map(doc => doc.data()));
    });
    return () => subscriber();
  }, []);
}

Redux bindings for Firebase. Includes React Hooks and Higher Order Components.

Pros of react-redux-firebase

  • Integrates seamlessly with Redux, allowing for centralized state management
  • Provides more extensive features for complex applications, including authentication helpers and population of nested data
  • Offers a wider range of hooks and HOCs for easier integration with React components

Cons of react-redux-firebase

  • Steeper learning curve due to Redux integration and more complex API
  • Potentially heavier bundle size due to additional dependencies
  • May be overkill for simpler applications that don't require Redux

Code Comparison

reactfire:

import { useFirestoreCollection } from 'reactfire';

function TodoList() {
  const todos = useFirestoreCollection(firestore.collection('todos'));
  return <ul>{todos.map(todo => <li key={todo.id}>{todo.text}</li>)}</ul>;
}

react-redux-firebase:

import { useFirestoreConnect } from 'react-redux-firebase';
import { useSelector } from 'react-redux';

function TodoList() {
  useFirestoreConnect([{ collection: 'todos' }]);
  const todos = useSelector(state => state.firestore.ordered.todos);
  return <ul>{todos.map(todo => <li key={todo.id}>{todo.text}</li>)}</ul>;
}

Both libraries provide hooks for easy integration with Firebase, but react-redux-firebase requires Redux setup and uses a different approach to connect and retrieve data.

React Hooks for Firebase.

Pros of react-firebase-hooks

  • Simpler API with fewer abstractions, making it easier to understand and use
  • More focused on core Firebase functionality, potentially leading to a smaller bundle size
  • Actively maintained with regular updates and community support

Cons of react-firebase-hooks

  • Less comprehensive coverage of Firebase features compared to reactfire
  • Lacks some advanced features and optimizations present in reactfire
  • May require more manual setup and configuration for certain use cases

Code Comparison

reactfire:

import { useFirestoreCollectionData } from 'reactfire';

function MyComponent() {
  const { status, data } = useFirestoreCollectionData(myCollectionRef);
  return status === 'loading' ? 'Loading...' : <ul>{data.map(/* ... */)}</ul>;
}

react-firebase-hooks:

import { useCollection } from 'react-firebase-hooks/firestore';

function MyComponent() {
  const [value, loading, error] = useCollection(myCollectionRef);
  return loading ? 'Loading...' : <ul>{value.docs.map(/* ... */)}</ul>;
}

Both libraries provide hooks for interacting with Firebase, but reactfire offers a more abstracted approach with additional features, while react-firebase-hooks provides a simpler, more direct interface to Firebase functionality. The choice between them depends on the specific needs of your project and your preferred level of abstraction.

🔥 A collection of Firebase plugins for Flutter apps.

Pros of FlutterFire

  • More comprehensive Firebase integration, covering a wider range of Firebase services
  • Better documentation and more extensive examples for Flutter developers
  • Actively maintained by the official Firebase team, ensuring faster updates and better support

Cons of FlutterFire

  • Steeper learning curve due to more complex API and extensive features
  • Potentially larger app size due to the inclusion of multiple Firebase services
  • May require more setup and configuration compared to ReactFire

Code Comparison

ReactFire:

import { useFirestore, useFirestoreCollectionData } from 'reactfire';

function App() {
  const firestore = useFirestore();
  const usersCollection = firestore.collection('users');
  const { data: users } = useFirestoreCollectionData(usersCollection);
}

FlutterFire:

import 'package:cloud_firestore/cloud_firestore.dart';

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: FirebaseFirestore.instance.collection('users').snapshots(),
      builder: (context, snapshot) {
        // Handle snapshot data
      },
    );
  }
}

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

ReactFire

Hooks, Context Providers, and Components that make it easy to interact with Firebase.

What is ReactFire?

  • Easy realtime updates for your function components - Hooks like useUserand useFirestoreCollection let you easily subscribe to auth state, realtime data, and all other Firebase SDK events. Plus, they automatically unsubscribe when your component unmounts.
  • Access Firebase libraries from any component - Need the Firestore SDK? useFirestore. Remote Config? useRemoteConfig.
  • Safely configure Firebase libraries - Libraries like Firestore and Remote Config require settings like enablePersistence to be set before any data fetches are made. This can be tough to support in React's world of re-renders. ReactFire gives you useInitFirestore and useInitRemoteConfig hooks that guarantee they're set before anything else.
  • Optional <Suspense> support - Hand loading states to React instead of checking a status yourself. Off by default, opt in with the suspense prop. See Suspense below.

Platform support

ReactFire is designed for web React apps and wraps the Firebase Web SDK. It is not compatible with React Native or Expo. For React Native projects, use react-native-firebase instead.

Install

# npm
npm install --save firebase reactfire

# or

# yarn
yarn add firebase reactfire

Depending on your targeted platforms you may need to install polyfills. The most commonly needed will be globalThis and Proxy.

Docs

Example use

Check out the live version on StackBlitz!

import React from 'react';
import { render } from 'react-dom';

import { doc, getFirestore } from 'firebase/firestore';
import { FirebaseAppProvider, FirestoreProvider, useFirestoreDocData, useFirestore, useFirebaseApp } from 'reactfire';

const firebaseConfig = {
  /* Add in your config object from the Firebase console */
};

function BurritoTaste() {
  // access the Firestore library
  const burritoRef = doc(useFirestore(), 'tryreactfire', 'burrito');

  // subscribe to a document for realtime updates. just one line!
  const { status, data } = useFirestoreDocData(burritoRef);

  // check the loading status
  if (status === 'loading') {
    return <p>Fetching burrito flavor...</p>;
  }

  return <p>The burrito is {data.yummy ? 'good' : 'bad'}!</p>;
}

function App() {
  const firestoreInstance = getFirestore(useFirebaseApp());
  return (
    <FirestoreProvider sdk={firestoreInstance}>
      <h1>🌯</h1>
      <BurritoTaste />
    </FirestoreProvider>
  );
}

render(
  <FirebaseAppProvider firebaseConfig={firebaseConfig}>
    <App />
  </FirebaseAppProvider>,
  document.getElementById('root')
);

Status

Status: Experimental

This repository is maintained by Googlers but is not a supported Firebase product. Issues here are answered by maintainers and other community members on GitHub on a best-effort basis.

Suspense

ReactFire's hooks can throw promises for <Suspense> to catch, so React handles loading states for you instead of you checking status on each result.

This is off by default. Opt in with the suspense prop on FirebaseAppProvider:

<FirebaseAppProvider firebaseConfig={firebaseConfig} suspense={true}>

<SuspenseWithPerf /> does the same and also measures how long the fallback was shown, using the browser's User Timing API.

See example/withSuspense for full samples.

NPM DownloadsLast 30 Days