React Stripe.js reference
React Stripe.js is a thin wrapper around Stripe Elements. It allows you to add Elements to any React app.
The Stripe.js reference covers complete Elements customization details.
You can use Elements with any Stripe product to collect online payments. To find the right integration path for your business, explore our docs.
This reference covers the full React Stripe.js API. If you prefer to learn by doing, check out our documentation on accepting a payment or take a look at a sample project in GitHub.
Prerequisites
This doc assumes that you already have a basic working knowledge of React and that you have already set up a React project. If you’re new to React, we recommend that you take a look at the Getting Started guide before continuing.
Setup
The demo in CodeSandbox lets you try out React Stripe.js without having to create a new project.
Elements provider
The Elements provider allows you to use Element components and access the Stripe object in any nested component. Render an Elements provider at the root of your React app so that it is available everywhere you need it.
To use the Elements provider, call loadStripe from @stripe/stripe-js with your publishable key. The loadStripe function asynchronously loads the Stripe.js script and initializes a Stripe object. Pass the returned Promise to Elements.
import {Elements} from '@stripe/react-stripe-js'; import {loadStripe} from '@stripe/stripe-js'; // Make sure to call `loadStripe` outside of a component’s render to avoid // recreating the `Stripe` object on every render. const stripePromise = loadStripe(); const App = () => { return ( <Elements stripe={stripePromise}> <MyCheckoutForm /> </Elements> ); };'pk_test_01QZ55AeQfGutsrsRjjkToqz'
prop | description |
|---|---|
| required A Stripe object or a You can also pass in |
| optional Optional Elements configuration options. See available options. Once the |
Element components
Element components provide a flexible way to securely collect payment information in your React app.
You can mount individual Element components inside of your Elements tree. Note that you can only mount one of each type of Element.
import {CardElement} from '@stripe/react-stripe-js'; <CardElement options={{ style: { base: { fontSize: '16px', color: '#424770', '::placeholder': { color: '#aab7c4', }, }, invalid: { color: '#9e2146', }, }, }} />
prop | description |
|---|---|
| optional Passes through to the Element’s container. |
| optional Passes through to the Element’s container. |
| optional An object containing Element configuration options. See available options. |
| optional Triggered when the Element loses focus. |
| optional Triggered when data exposed by this Element is changed (e.g., when there is an error). For more information, refer to the Stripe.js reference. |
| optional Triggered by the For more information, refer to the Stripe.js reference. |
| optional Triggered when the Element receives focus. |
| optional Triggered when the Element is fully rendered and can accept imperative |
Available Element components
There are many different kinds of Elements, useful for collecting different kinds of payment information. These are the available Elements today.
Component | Usage |
|---|---|
CardElement | A flexible single-line input that collects all necessary card details. |
CardNumberElement | Collects the card number. |
CardExpiryElement | Collects the card‘s expiration date. |
CardCvcElement | Collects the card‘s CVC number. |
PaymentRequestButtonElement | An all-in-one checkout button backed by either Apple Pay or the Payment Request API. Refer to the Payment Request Button docs for more information. |
AuBankAccountElement | Collects Australian bank account information (BSB and account number) for use with BECS Direct Debit payments. |
IbanElement | The International Bank Account Number (IBAN). Available for SEPA countries. |
IdealBankElement | The customer’s bank, for use with iDEAL payments. |
FpxBankElement | The customer’s bank, for use with FPX payments. |
AfterpayClearpayMessageElement | Displays installments messaging for Afterpay payments. |
useElements hook
useElements(): Elements | null
To safely pass the payment information collected by an Element to the Stripe API, access the component’s underlying Element instance so that you can use it with other Stripe.js methods. If you use the React Hooks API, then useElements is the recommended and easiest way to access a mounted Element. If you need to access an Element from a class component, use ElementsConsumer instead.
Note that if you pass a Promise to the Elements provider and the Promise has not yet resolved, then useElements will return null.
import {CardElement, useStripe, useElements} from '@stripe/react-stripe-js'; const CheckoutForm = () => { const stripe = useStripe(); const elements = useElements(); const handleSubmit = async (event) => { // Block native form submission. event.preventDefault(); if (!stripe || !elements) { // Stripe.js has not loaded yet. Make sure to disable // form submission until Stripe.js has loaded. return; } // Get a reference to a mounted CardElement. Elements knows how // to find your CardElement because there can only ever be one of // each type of element. const cardElement = elements.getElement(CardElement); // Use your card Element with other Stripe.js APIs const {error, paymentMethod} = await stripe.createPaymentMethod({ type: 'card', card: cardElement, }); if (error) { console.log('[error]', error); } else { console.log('[PaymentMethod]', paymentMethod); } }; return ( <form onSubmit={handleSubmit}> <CardElement /> <button type="submit" disabled={!stripe}> Pay </button> </form> ); };
useStripe hook
useStripe(): Stripe | null
The useStripe hook returns a reference to the Stripe instance passed to the Elements provider. If you need to access the Stripe object from a class component, use ElementsConsumer instead.
Note that if you pass a Promise to the Elements provider and the Promise has not yet resolved, then useStripe will return null.
import {CardElement, useStripe, useElements} from '@stripe/react-stripe-js'; const CheckoutForm = () => { const stripe = useStripe(); const elements = useElements(); const handleSubmit = async (event) => { // Block native form submission. event.preventDefault(); if (!stripe || !elements) { // Stripe.js has not loaded yet. Make sure to disable // form submission until Stripe.js has loaded. return; } // Get a reference to a mounted CardElement. Elements knows how // to find your CardElement because there can only ever be one of // each type of element. const cardElement = elements.getElement(CardElement); // Use your card Element with other Stripe.js APIs const {error, paymentMethod} = await stripe.createPaymentMethod({ type: 'card', card: cardElement, }); if (error) { console.log('[error]', error); } else { console.log('[PaymentMethod]', paymentMethod); } }; return ( <form onSubmit={handleSubmit}> <CardElement /> <button type="submit" disabled={!stripe}> Pay </button> </form> ); };
ElementsConsumer
To safely pass the payment information collected by an Element to the Stripe API, access the component’s underlying Element instance so that you can use it with other Stripe.js methods. If you need to access the Stripe object or an Element from a class component, then ElementsConsumer provides an alternative to the useElements and useStripe hooks.
import {CardElement, ElementsConsumer} from '@stripe/react-stripe-js'; class CheckoutForm extends React.Component { handleSubmit = async (event) => { // Block native form submission. event.preventDefault(); const {stripe, elements} = this.props; if (!stripe || !elements) { // Stripe.js has not loaded yet. Make sure to disable // form submission until Stripe.js has loaded. return; } // Get a reference to a mounted CardElement. Elements knows how // to find your CardElement because there can only ever be one of // each type of element. const cardElement = elements.getElement(CardElement); const {error, paymentMethod} = await stripe.createPaymentMethod({ type: 'card', card: cardElement, }); if (error) { console.log('[error]', error); } else { console.log('[PaymentMethod]', paymentMethod); } }; render() { const {stripe} = this.props; return ( <form onSubmit={this.handleSubmit}> <CardElement /> <button type="submit" disabled={!stripe}> Pay </button> </form> ); } } const InjectedCheckoutForm = () => { return ( <ElementsConsumer> {({elements, stripe}) => ( <CheckoutForm elements={elements} stripe={stripe} /> )} </ElementsConsumer> ); };
prop | description |
|---|---|
| required This component takes a function as child. The function that you provide will be called with the Elements object that is managing your Element components and the Stripe object that you passed to <Elements>. Note that if you pass a |
Customization and styling
Each element is actually mounted in an iframe under the hood. Because of this, Elements are unlikely to work with any existing styling and component frameworks that you may have. Despite this, you should still be able to fully configure an Element to seamlessly blend in with the rest of your site. Fully customizing Elements consists of configuring the Element with options, applying styles to the Element container, and responding to events.
See what you can do with Elements using the example below as a starting point in CodeSandbox.
Next steps
Build an integration with React Stripe.js and Elements.