Vue.js 卡片中的某些物品没有反应性
Vue.js some items in card are not reactivity
几天来我一直在为这个问题苦苦挣扎。我希望有人能帮帮忙
我出去。
我有一张结账卡,我正在尝试更新数量和总价。 :
父组件:
<template>
<div>
<upsell-checkout-product
:product="product"
:index="index"
@remote="remove"
@increment="increment"
@decrement="decrement"
></upsell-checkout-product>
</div>
</template>
<script>
export default {
props: {
runId: {
type: String,
default: null
},
card: {
type: Array,
default: null
},
customer: {
type: Object,
default: null
},
order: {
type: Object,
default: null
}
},
data() {
return {
localCard: []
}
},
mounted() {
this.localCard = this.card;
},
methods: {
increment(index) {
Vue.set(this.localCard[index], 'quantity', this.localCard[index].quantity+=1);
},
decrement(index) {
if(this.localCard[index].quantity > 0) {
this.localCard[index].quantity--;
}
},
remove(index) {
this.localCard.splice(index, 1);
}
}
}
</script>
子组件:
<template>
<div class="text-green">
<div class="flex center p-2">
<div class="w-1/3">
<img class="rounded-full h-24 w-24 border border-green"
:src="'/storage/articles/' + product.article.image_url"
v-if="product.article.image_url"
/>
</div>
<div class="w-2/3">
<h3>{{ product.article.name }}</h3>
<h5 class="mt-2">Bestaalstatus</h5>
<div>
<div class="bg-red text-white text-xs mt-2 rounded p-1 w-1/3">
Niet voldaan
</div>
</div>
</div>
</div>
<div class="center justify-between p-2 border-t border-b border-dotted border-green">
<div class="w-1/5">
<div class="cursor-pointer" @click="$emit('remove', index)">
x
</div>
</div>
<div class="center w-2/5">
<div class="cursor-pointer" @click="$emit('decrement', index)">
-
</div>
<input type="number"
class="input-main w-1/2 ml-1 mr-1 h-8"
v-model="product.quantity">
<div class="cursor-pointer" @click="$emit('increment', index)">
+
</div>
</div>
<div class="flex justify-end w-2/5">
<div v-if="product.article.member_discount_percentage">
<p class="text-sm">€ <strike>{{ price }}</strike> - € {{ discountPrice }}</p>
</div>
<div v-else>
<p class="text-sm">€ {{ discountPrice }}</p>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['product', 'index'],
computed: {
price: function() {
return (this.product.quantity * this.product.article.price).toFixed(2);
},
discountPrice: function() {
return (this.product.quantity * this.product.article.discount_price).toFixed(2);
}
}
}
</script>
问题是我已经从服务器获取的卡片项目在 localCard 中是反应性的,但是没有从服务器获取但在整个结帐过程中添加的项目不是...
我已经尝试制作 JsFiddle,但无法重现该问题。显然这是一个反应性问题,但我不知道该如何解决。
我需要一些帮助,谢谢!
我认为问题不在您向我们展示的代码中。
mounted() {
this.localCard = this.card;
},
我认为 this.card
不是反应性的(至少不是对所有项目),这给你带来了麻烦。
你可以通过一个简单的 console.log(this.card)
来检查我的假设,在那里你可以看到卡片数组中的所有项目是否都是观察者。
希望这对您有所帮助。
终于修好了!
当我将新项目推送到数组并执行此操作时:
.push(Object.assign({}, article));
突然好用了!感谢您的帮助。
几天来我一直在为这个问题苦苦挣扎。我希望有人能帮帮忙 我出去。
我有一张结账卡,我正在尝试更新数量和总价。 :
父组件:
<template>
<div>
<upsell-checkout-product
:product="product"
:index="index"
@remote="remove"
@increment="increment"
@decrement="decrement"
></upsell-checkout-product>
</div>
</template>
<script>
export default {
props: {
runId: {
type: String,
default: null
},
card: {
type: Array,
default: null
},
customer: {
type: Object,
default: null
},
order: {
type: Object,
default: null
}
},
data() {
return {
localCard: []
}
},
mounted() {
this.localCard = this.card;
},
methods: {
increment(index) {
Vue.set(this.localCard[index], 'quantity', this.localCard[index].quantity+=1);
},
decrement(index) {
if(this.localCard[index].quantity > 0) {
this.localCard[index].quantity--;
}
},
remove(index) {
this.localCard.splice(index, 1);
}
}
}
</script>
子组件:
<template>
<div class="text-green">
<div class="flex center p-2">
<div class="w-1/3">
<img class="rounded-full h-24 w-24 border border-green"
:src="'/storage/articles/' + product.article.image_url"
v-if="product.article.image_url"
/>
</div>
<div class="w-2/3">
<h3>{{ product.article.name }}</h3>
<h5 class="mt-2">Bestaalstatus</h5>
<div>
<div class="bg-red text-white text-xs mt-2 rounded p-1 w-1/3">
Niet voldaan
</div>
</div>
</div>
</div>
<div class="center justify-between p-2 border-t border-b border-dotted border-green">
<div class="w-1/5">
<div class="cursor-pointer" @click="$emit('remove', index)">
x
</div>
</div>
<div class="center w-2/5">
<div class="cursor-pointer" @click="$emit('decrement', index)">
-
</div>
<input type="number"
class="input-main w-1/2 ml-1 mr-1 h-8"
v-model="product.quantity">
<div class="cursor-pointer" @click="$emit('increment', index)">
+
</div>
</div>
<div class="flex justify-end w-2/5">
<div v-if="product.article.member_discount_percentage">
<p class="text-sm">€ <strike>{{ price }}</strike> - € {{ discountPrice }}</p>
</div>
<div v-else>
<p class="text-sm">€ {{ discountPrice }}</p>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['product', 'index'],
computed: {
price: function() {
return (this.product.quantity * this.product.article.price).toFixed(2);
},
discountPrice: function() {
return (this.product.quantity * this.product.article.discount_price).toFixed(2);
}
}
}
</script>
问题是我已经从服务器获取的卡片项目在 localCard 中是反应性的,但是没有从服务器获取但在整个结帐过程中添加的项目不是...
我已经尝试制作 JsFiddle,但无法重现该问题。显然这是一个反应性问题,但我不知道该如何解决。
我需要一些帮助,谢谢!
我认为问题不在您向我们展示的代码中。
mounted() {
this.localCard = this.card;
},
我认为 this.card
不是反应性的(至少不是对所有项目),这给你带来了麻烦。
你可以通过一个简单的 console.log(this.card)
来检查我的假设,在那里你可以看到卡片数组中的所有项目是否都是观察者。
希望这对您有所帮助。
终于修好了!
当我将新项目推送到数组并执行此操作时:
.push(Object.assign({}, article));
突然好用了!感谢您的帮助。