我有一个 watch 来检查所选标签:
watch: {
search (val) {
for (let i = 0; i < val.length; i++) {
this.form_data.products_credit.push({
product_id: val[i].id,
quantity: null,
package_size: null,
purchase_price: null,
warehouse_id: null
});
}
}
}
这工作正常,但当用户选择例如 tag1 时就会出现问题
this.form_data.products_credit
值等于:
[
{
product_id: 1,
quantity: null,
package_size: null,
purchase_price: null,
warehouse_id: null
}
]
之后,如果用户选择tag2,则this.form_data.products_credit
结果将是:
[
{
product_id: 1,
quantity: null,
package_size: null,
purchase_price: null,
warehouse_id: null
},
{
product_id: 2,
quantity: null,
package_size: null,
purchase_price: null,
warehouse_id: null
},
{
product_id: 2,
quantity: null,
package_size: null,
purchase_price: null,
warehouse_id: null
}
]
What I am expecting:
我没想到在选择另一个标签后会发生重复,但这是正常的,因为我正在循环抛出它们。
What I have done:
我尝试在循环之前清空我的products_credit
,如下所示:
this.form_data.products_credit = []
循环之前。
效果很好,但我不希望这样,因为它会对我的下一步产生副作用。
问题的工作示例:here
最佳答案
您可以在添加之前检查您的数组是否已包含您的产品:
watch: {
search (val) {
for (let i = 0; i < val.length; i++) {
if (
!this.form_data.products_credit.some(item => {
item.product_id === val[i].id
})
) {
this.form_data.products_credit.push({
product_id: val[i].id,
quantity: null,
package_size: null,
purchase_price: null,
warehouse_id: null
});
}
}
}
}
但我觉得对于基于用户输入生成的标签数组计算属性的问题有更简单、更快捷的解决方案。如果您能够分享更多您正在做的事情,也许我们可以找到更好的解决方案。
编辑: 看到您的 JSFiddle 后,这里有一个仅使用计算属性( JSFiddle )来处理您的问题的建议:
data: {
search: [],
products: [
{
id: 1,
title: "first product",
category: "first category",
image: "first_image.jpg",
barcode: "123123123"
},
{
id: 2,
title: "second product",
category: "second category",
image: "second_image.jpg",
barcode: "23232323"
},
],
form_data: {
category: null,
products_credit: [],
}
},
methods: {
searchProducts (query) {
//
}
},
computed : {
selectedProduct () {
return this.search.map(item => {
return {
product_id: item.id,
quantity: null,
package_size: null,
purchase_price: null,
warehouse_id: null
}
})
}
}
这是执行此操作的首选方法,因为代码较短,并且没有资源昂贵的观察者。它还同时处理从用户搜索中删除项目。
关于javascript - VueJS 根据 watch 中的键从对象数组中获取唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54333504/