我有一个简单的vue实例,我用它来生成Stripe标记.
它看起来像这样:
var vm = new Vue({ el: '#checkout-form', data: { stripe_publishable_key: '{{ config('services.stripe.publishable') }}', card: { number: null, cvc: null, exp: null, }, }, ready: function() { Stripe.setPublishableKey(this.stripe_publishable_key); }, methods: { getStripeToken: function() { Stripe.card.createToken(this.card, this.stripeResponseHandler); }, stripeResponseHandler: function(status, response) { // Process response }, }, });
基本上我将card
Vue实例中的对象(绑定到某些表单输入)传递给Stripe的card.createToken
方法.这应该接受输入并调用处理程序,并在响应时传入响应.
这一切都正常,除了card.createToken
修改卡对象并导致我的Vue实例上的卡对象发生更改 - 它插入自己的属性并导致绑定上的奇怪行为
.
有没有办法将card
vue属性作为未绑定到vue实例的副本传递给Stripe,因此不会因此而改变?
更新
从本质上讲,这种情况正在发生,因为JavaScript将对象作为引用副本传递,这意味着原始对象可以被接收它的任何函数修改.显而易见的解决方案是通过循环或其他方式克隆对象,但我想知道在Vue中是否有更好的方法.
有很多方法可以复制这个对象,但只有一个来自Vue本身:
var cardCopy = Vue.util.extend({}, this.card);
它实际上相当于jQuery的扩展,深度设置为true.