This tutorial is intended for developers interested in building an e-commerce application using React Native and Firebase.
Prerequisites:
- Basic understanding of JavaScript
- Familiarity with React Native
- Node.js and npm/yarn installed on your system
- An active Firebase project
Getting Started
Firstly, you will need to set up a new React Native project.
If you don't have the React Native command line interface, install it globally with npm:
npm install -g react-native-cli
Then, create a new React Native project:
react-native init ecommerceApp
Navigate into your new project folder:
cd ecommerceApp
I recommend using VSCode for React Native development, so get it if you don't have it yet.
Setting up Firebase
Next, install Firebase in your project:
npm install firebase
In your Firebase console, go to "Project settings", under the gear icon, then go to "Your apps", add a new web app and copy your Firebase config object.
In your project, create a new file called Firebase.js
in your root directory and paste your config object:
import firebase from 'firebase';
const firebaseConfig = {
apiKey: "your-api-key",
authDomain: "your-auth-domain",
databaseURL: "your-database-url",
projectId: "your-project-id",
storageBucket: "your-storage-bucket",
messagingSenderId: "your-messaging-sender-id",
appId: "your-app-id"
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
export default firebase;
Replace the placeholders with your Firebase details.
Creating the App Navigation
We'll use React Navigation for routing. Install it using the following command:
npm install @react-navigation/native @react-navigation/stack
We're going to create three screens: Home, Product Details and Cart.
Let's create a new directory called screens
and inside it, create three files: Home.js
, ProductDetails.js
, and Cart.js
.
Your directory should look like this:
ecommerceApp/
screens/
Home.js
ProductDetails.js
Cart.js
App.js
Firebase.js
Building the Home Screen
In Home.js
, we're going to fetch the products from Firebase and display them:
import React, { useEffect, useState } from 'react';
import { View, Text, FlatList, TouchableOpacity } from 'react-native';
import firebase from '../Firebase';
const Home = ({ navigation }) => {
const [products, setProducts] = useState([]);
useEffect(() => {
const fetchProducts = async () => {
const db = firebase.firestore();
const data = await db.collection("products").get();
setProducts(data.docs.map(doc => ({ ...doc.data(), id: doc.id })));
};
fetchProducts();
}, []);
return (
<View>
<FlatList
data={products}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<TouchableOpacity onPress={() => navigation.navigate('ProductDetails', { item })}>
<Text>{item.name}</Text>
<Text>{item.price}</Text>
</TouchableOpacity>
)}
/>
</View>
);
};
export default Home;
Building the Product Details Screen
In ProductDetails.js
, we're going to display the product details and provide an option to add the product to the cart.
import React from 'react';
import { View, Text, Button } from 'react-native';
import firebase from '../Firebase';
const ProductDetails = ({ route, navigation }) => {
const { item } = route.params;
const addToCart = async () => {
const db = firebase.firestore();
await db.collection("cart").add(item);
navigation.navigate('Cart');
};
return (
<View>
<Text>{item.name}</Text>
<Text>{item.description}</Text>
<Text>{item.price}</Text>
<Button title="Add to Cart" onPress={addToCart} />
</View>
);
};
export default ProductDetails;
Building the Cart Screen
In Cart.js
, we're going to fetch the products from the cart collection and display them:
import React, { useEffect, useState } from 'react';
import { View, Text, FlatList } from 'react-native';
import firebase from '../Firebase';
const Cart = () => {
const [cart, setCart] = useState([]);
useEffect(() => {
const fetchCart = async () => {
const db = firebase.firestore();
const data = await db.collection("cart").get();
setCart(data.docs.map(doc => ({ ...doc.data(), id: doc.id })));
};
fetchCart();
}, []);
return (
<View>
<FlatList
data={cart}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<View>
<Text>{item.name}</Text>
<Text>{item.price}</Text>
</View>
)}
/>
</View>
);
};
export default Cart;
Finally, update the App.js
file to include the navigation:
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import Home from './screens/Home';
import ProductDetails from './screens/ProductDetails';
import Cart from './screens/Cart';
const Stack = createStackNavigator();
const App = () => {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="ProductDetails" component={ProductDetails} />
<Stack.Screen name="Cart" component={Cart} />
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;
You now have a basic e-commerce app. You can run the app using:
react-native run-android
or
react-native run-ios
Remember, this is a very basic e-commerce app. For a production-ready app, you'll need to add user authentication, error handling, a checkout process, and more. You can check out this amazing fully functional React Native E-commerce App if you want to save a ton of time. Happy coding!
Find more articles at Devbrite Medium.
Top comments (1)
Great article! Creating an e-commerce app with React Native is a smart choice for building fast, cross-platform apps. The step-by-step guide does a great job of explaining how to integrate essential features like product listing, cart management, and payment systems. React Native's flexibility and performance make it ideal for scaling e-commerce apps. How do you handle performance optimization when scaling such apps for larger audiences?
Looking to build a high-performance e-commerce app with React Native? Dive into this detailed guide that covers everything from architecture to optimisation techniques for a seamless shopping experience. Click here to get started: Build High-Performance E-commerce App with React Native
Some comments may only be visible to logged-in visitors. Sign in to view all comments.