【发布时间】:2021-11-19 16:42:47
【问题描述】:
当我的用户使用订单信息和客户详细信息填写表单时,我禁用了提交按钮,直到我的验证得到满足。我使用的库是 express-validate。
我想要做的也,是保持按钮禁用,首先,直到用户将信用卡信息输入到 Stripe 元素它实际上是一张有效的卡。 其次,在提交后,再次禁用该按钮,这样用户就无法继续点击该按钮。当成功或成功或错误通知返回时,我将重定向。
到目前为止,我还没有成功触发 cardElement.on() 方法,Stripe events。这就是我想要实现的目标,see client.js
这就是我目前所拥有的......
首页.vue
<form
id="order-info"
class="form-container"
@submit.prevent="createOrder"
>
...
<div class="stripe-container">
<div id="stripe-element-card" ref="card">
<!-- Stripe.js injects the Card Element -->
</div>
</div>
<p id="card-error" role="alert" />
<p class="result-message hidden">
Payment succeeded
</p>
<button
v-if="toggleUserInfo"
id="submit"
class="stripe"
:disabled="$v.$invalid" // this is based on current form validations
type="submit"
// I want to disable also until card is valid and then disable again
// after user clicks to prevent additional clicking until success/error returns
>
<div
id="spinner"
class="spinner"
:class="{ hidden: !isLoading }"
></div>
<span id="button-text" :class="{ hidden: isLoading }">Pay now</span>
<script>
async mounted() {
stripe = await loadStripe(process.env.VUE_APP_STRIPE_PK);
elements = stripe.elements();
card = elements.create("card", { style: style });
card.mount("#stripe-element-card");
},
...
createOrder 方法
async createOrder(event) {
console.log(event.target);
this.loading(true);
this.$v.$touch();
if (!this.$v.$invalid) {
// gather order and user details, superfluous code
const cardElement = elements.getElement("card");
const billingDetails = {
name: user.name,
address: {
city: user.city,
line1: user.street,
state: "NY"
},
phone: user.phone
};
try {
cardElement.on("change", event => {
console.log("LOGGING THE CARD ELEMENT EVENT", event);
// NOT SEEING ANYTHING HERE
// disable button until valid card is inputted
});
...
编辑
在下面实现庞培的回答时,mounted() 中的监听器,这是 console.logs 的样子,直到信用卡输入完成...
【问题讨论】:
标签: javascript html forms vue.js stripe-payments