Vue Stripe Elements
Flexible and powerful Vue components for Stripe. It's a glue between Stripe.js and Vue component lifecycle.
- Vue 2 component collection: stable ✅
- Vue 3 version: in development 🚧
Quickstart
1. Install package:
npm i vue-stripe-elements-plus --save-dev
yarn add vue-stripe-elements-plus --dev
2. Add Stripe.js library to the page:
<script src="https://js.stripe.com/v3/"></script>
Alternatively, you can load Stripe library dynamically. Just make sure it's ready before your components mount.
3. Use built-in components
Create card
<template>
<div class="payment-simple">
<StripeElements
:stripe-key="stripeKey"
:instance-options="instanceOptions"
:elements-options="elementsOptions"
#default="{ elements }" // attention: important part!
ref="elms"
>
<StripeElement
type="card"
:elements="elements"
:options="cardOptions"
ref="card"
/>
</StripeElements>
<button @click="pay" type="button">Pay</button>
</div>
</template>
<script>
import { StripeElements, StripeElement } from 'vue-stripe-elements-plus'
export default {
name: 'PaymentSimple',
components: {
StripeElements,
StripeElement
},
data () {
return {
stripeKey: 'pk_test_TYooMQauvdEDq54NiTphI7jx',
instanceOptions: {
},
elementsOptions: {
},
cardOptions: {
value: {
postalCode: ''
}
}
}
},
methods: {
pay () {
const groupComponent = this.$refs.elms
const cardComponent = this.$refs.card
const cardElement = cardComponent.stripeElement
groupComponent.instance.createToken(cardElement).then(result => {
})
}
}
}
</script>
4. Get advanced
Create multiple elements
<StripeElements
:stripe-key="stripeKey"
:instance-options="instanceOptions"
:elements-options="elementsOptions"
#default="{ elements }" // attention: important part!
>
<StripeElement
type="cardNumber"
:elements="elements"
:options="cardNumberOptions"
/>
<StripeElement
type="postalCode"
:elements="elements"
:options="postalCodeOptions"
/>
</StripeElements>
5. Go wild
You can even create multiple groups, don't ask me why. It's possible.
<StripeElements
:stripe-key="stripeKey1"
:instance-options="instanceOptions1"
:elements-options="elementsOptions1"
#default="{ elements }" // attention: important part!
>
<StripeElement
:elements="elements"
:options="cardOptions"
/>
</StripeElements>
<StripeElements
:stripe-key="stripeKey2"
:instance-options="instanceOptions2"
:elements-options="elementsOptions2"
#default="{ elements }" // attention: important part!
>
<StripeElement
type="iban"
:elements="elements"
:options="ibanOptions"
/>
</StripeElements>
Styles
No base style included. Main reason: overriding it isn't fun. Style as you wish via element options: see details.
API Reference
StripeElements.vue
Think of it as of individual group of elements. It creates stripe instance and elements object.
import { StripeElements } from 'vue-stripe-elements-plus'
props
stripeKey: {
type: String,
required: true,
},
instanceOptions: {
type: Object,
default: () => ({}),
},
elementsOptions: {
type: Object,
default: () => ({}),
},
data
You can access instance
and elements
by adding ref to StripeElements component.
instance: {},
elements: {},
default scoped slot
Elegant solution for props. Really handy because you can make instance
and elements
available to all children without adding extra code.
<StripeElements #default="{elements, instance}">
<StripeElement :elements="elements" />
<CustomComponent :instance="instance" />
</StripeElements>
StripeElement.vue
Universal and type agnostic component. Create any element supported by Stripe.
props
elements: {
type: Object,
required: true,
},
type: {
type: String,
default: () => 'card',
},
options: {
type: [Object, undefined],
},
data
stripeElement
domElement
options
Element options are reactive. Recommendation: don't use v-model on StripeElement
, instead pass value via options.
data() {
return {
elementOptions: {
value: {
postalCode: ''
}
}
}
},
methods: {
changePostalCode() {
this.elementOptions.value.postalCode = '12345'
}
}
events
Following events are emitted on StripeElement
- change
- ready
- focus
- blur
- escape
<StripeElement
:elements="elements"
@blur="doSomething"
/>
Helpers
In case you like the manual gearbox. Check stripeElements.js for details.
import { initStripe, createElements, createElement } from 'vue-stripe-elements-plus'