A lightweight shopping cart hook for React, Next.js, and Gatsby

react-use-cart
A lightweight shopping cart hook for React, Next.js, and Gatsby
Why?
- No dependencies
- 💳 Not tied to any payment gateway, or checkout - create your own!
- 🔥 Persistent carts with local storage, or your own adapter
- ⭐️ Supports multiples carts per page
- 🛒 Flexible cart item schema
- 🥞 Works with Next, Gatsby, React
- ♻️ Trigger your own side effects with cart handlers (on item add, update, remove)
- 🛠 Built with TypeScript
- ✅ Fully tested
- 🌮 Used by Dines
Quick Start
import { CartProvider, useCart } from "react-use-cart"; function Page() { const { addItem } = useCart(); const products = [ { id: 1, name: "Malm", price: 9900, quantity: 1 }, { id: 2, name: "Nordli", price: 16500, quantity: 5 }, { id: 3, name: "Kullen", price: 4500, quantity: 1 }, ]; return ( <div> {products.map((p) => ( <div key={p.id}> <button onClick={() => addItem(p)}>Add to cart</button> </div> ))} </div> ); } function Cart() { const { isEmpty, totalUniqueItems, items, updateItemQuantity, removeItem, } = useCart(); if (isEmpty) return <p>Your cart is empty</p>; return ( <> <h1>Cart ({totalUniqueItems})</h1> <ul> {items.map((item) => ( <li key={item.id}> {item.quantity} x {item.name} — <button onClick={() => updateItemQuantity(item.id, item.quantity - 1)} > - </button> <button onClick={() => updateItemQuantity(item.id, item.quantity + 1)} > + </button> <button onClick={() => removeItem(item.id)}>×</button> </li> ))} </ul> </> ); } function App() { return ( <CartProvider> <Page /> <Cart /> </CartProvider> ); }
Install
npm install react-use-cart # yarn add react-use-cart
CartProvider
You will need to wrap your application with the CartProvider
component so that the useCart
hook can access the cart state.
Carts are persisted across visits using localStorage
, unless you specify your own storage
adapter.
Usage
import React from "react"; import ReactDOM from "react-dom"; import { CartProvider } from "react-use-cart"; ReactDOM.render( <CartProvider>{/* render app/cart here */}</CartProvider>, document.getElementById("root") );
Props
Prop | Required | Description |
---|---|---|
id | No | id for your cart to enable automatic cart retrieval via window.localStorage . If you pass a id then you can use multiple instances of CartProvider . |
onSetItems | No | Triggered only when setItems invoked. |
onItemAdd | No | Triggered on items added to your cart, unless the item already exists, then onItemUpdate will be invoked. |
onItemUpdate | No | Triggered on items updated in your cart, unless you are setting the quantity to 0 , then onItemRemove will be invoked. |
onItemRemove | No | Triggered on items removed from your cart. |
storage | No | Must return [getter, setter] . |
metadata | No | Custom global state on the cart. Stored inside of metadata . |
useCart
The useCart
hook exposes all the getter/setters for your cart state.
setItems(items)
The setItems
method should be used to set all items in the cart. This will overwrite any existing cart items. A quantity
default of 1 will be set for an item implicitly if no quantity
is specified.
Args
items[]
(Required): An array of cart item object. You must provide anid
andprice
value for new items that you add to cart.
Usage
import { useCart } from "react-use-cart"; const { setItems } = useCart(); const products = [ { id: "ckb64v21u000001ksgw2s42ku", name: "Fresh Foam 1080v9", brand: "New Balance", color: "Neon Emerald with Dark Neptune", size: "US 10", width: "B - Standard", sku: "W1080LN9", price: 15000, }, { id: "cjld2cjxh0000qzrmn831i7rn", name: "Fresh Foam 1080v9", brand: "New Balance", color: "Neon Emerald with Dark Neptune", size: "US 9", width: "B - Standard", sku: "W1080LN9", price: 15000, }, ]; setItems(products);
addItem(item, quantity)
The addItem
method should be used to add items to the cart.
Args
item
(Required): An object that represents your cart item. You must provide anid
andprice
value for new items that you add to cart.quantity
(optional, default:1
): The amount of items you want to add.
Usage
import { useCart } from "react-use-cart"; const { addItem } = useCart(); const product = { id: "cjld2cjxh0000qzrmn831i7rn", name: "Fresh Foam 1080v9", brand: "New Balance", color: "Neon Emerald with Dark Neptune", size: "US 9", width: "B - Standard", sku: "W1080LN9", price: 15000, }; addItem(product, 2);
updateItem(itemId, data)
The updateItem
method should be used to update items in the cart.
Args
itemId
(Required): The cart itemid
you want to update.data
(Required): The updated cart item object.
Usage
import { useCart } from "react-use-cart"; const { updateItem } = useCart(); updateItem("cjld2cjxh0000qzrmn831i7rn", { size: "UK 10", });
updateItemQuantity(itemId, quantity)
The updateItemQuantity
method should be used to update an items quantity
value.
Args
itemId
(Required): The cart itemid
you want to update.quantity
(Required): The updated cart item quantity.
Usage
import { useCart } from "react-use-cart"; const { updateItemQuantity } = useCart(); updateItemQuantity("cjld2cjxh0000qzrmn831i7rn", 1);
removeItem(itemId)
The removeItem
method should be used to remove an item from the cart.
Args
itemId
(Required): The cart itemid
you want to remove.
Usage
import { useCart } from "react-use-cart"; const { removeItem } = useCart(); removeItem("cjld2cjxh0000qzrmn831i7rn");
emptyCart()
The emptyCart()
method should be used to remove all cart items, and resetting cart totals to the default 0
values.
Usage
import { useCart } from "react-use-cart"; const { emptyCart } = useCart(); emptyCart();
clearCartMetadata()
The clearCartMetadata()
will reset the metadata
to an empty object.
Usage
import { useCart } from "react-use-cart"; const { clearCartMetadata } = useCart(); clearCartMetadata();
setCartMetadata(object)
The setCartMetadata()
will replace the metadata
object on the cart. You must pass it an object.
Args
object
: A object with key/value pairs. The key being a string.
Usage
import { useCart } from "react-use-cart"; const { setCartMetadata } = useCart(); setCartMetadata({ notes: "This is the only metadata" });
updateCartMetadata(object)
The updateCartMetadata()
will update the metadata
object on the cart. You must pass it an object. This will merge the passed object with the existing metadata.
Args
object
: A object with key/value pairs. The key being a string.
Usage
import { useCart } from "react-use-cart"; const { updateCartMetadata } = useCart(); updateCartMetadata({ notes: "Leave in shed" });
items = []
This will return the current cart items in an array.
Usage
import { useCart } from "react-use-cart"; const { items } = useCart();
isEmpty = false
A quick and easy way to check if the cart is empty. Returned as a boolean.
Usage
import { useCart } from "react-use-cart"; const { isEmpty } = useCart();
getItem(itemId)
Get a specific cart item by id
. Returns the item object.
Args
itemId
(Required): Theid
of the item you're fetching.
Usage
import { useCart } from "react-use-cart"; const { getItem } = useCart(); const myItem = getItem("cjld2cjxh0000qzrmn831i7rn");
inCart(itemId)
Quickly check if an item is in the cart. Returned as a boolean.
Args
itemId
(Required): Theid
of the item you're looking for.
Usage
import { useCart } from "react-use-cart"; const { inCart } = useCart(); inCart("cjld2cjxh0000qzrmn831i7rn") ? "In cart" : "Not in cart";
totalItems = 0
This returns the totaly quantity of items in the cart as an integer.
Usage
import { useCart } from "react-use-cart"; const { totalItems } = useCart();
totalUniqueItems = 0
This returns the total unique items in the cart as an integer.
Usage
import { useCart } from "react-use-cart"; const { totalUniqueItems } = useCart();
cartTotal = 0
This returns the total value of all items in the cart.
Usage
import { useCart } from "react-use-cart"; const { cartTotal } = useCart();
metadata = {}
This returns the metadata set with updateCartMetadata
. This is useful for storing additional cart, or checkout values.
Usage
import { useCart } from "react-use-cart"; const { metadata } = useCart();