我有手表来检查所选标签:
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
}
]
我期望的是
我没想到选择另一个标签后会发生重复,但这是正常现象,因为我要循环将它们扔掉。
我做了什么:
我试图像这样在循环之前清空我的products_credit
:
this.form_data.products_credit = []
在循环之前。
它工作正常,但我不希望这样,因为它会在下一步中产生副作用。
问题的有效示例:here
答案 0 :(得分:1)
您可以在添加产品之前检查阵列中是否不包含产品:
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
}
})
}
}
这是执行此操作的首选方法,因为代码更短,并且没有监视程序占用资源。此外,它还可以同时从用户的搜索中删除项目。