vue3数据处理问题
功能需求:根据上面所选条件,向table中添加数据,向table内添加一条之后并输入出库数量,再次添加一条数据,table中原有的数据不能改变。
思路:创建处理函数disposeOutgoingData,每次添加或者删除table中的数据都会都会改变disposeOutgoingData的参数e(e是一个数组,存储选中数据的id)通过id和arrData数据进行对比,将数据保存到GoodsClaimed中,
问题:当我将arrData放在函数内去查找数据并保存到GoodsClaimed中的时候能实现功能需求,但是当我将arrData放到全局的时候会出现这个问题:我先在table中加入一条数据并输入出库数量后,再次向table中添加数据,第一条的出库量会消失不见。
解决方法:定义一个深拷贝方法,将全局的arrData拷贝之后再操作。
疑惑:为什么放在全局会出现这种情况
猜测:可能和vue3响应式有关系
// 在全局定义
const arrData = ref([
{ id: 101, kind: '1', name: '101', spec: '个', num: 10 },
{ id: 102, kind: '1', name: '102', spec: '个', num: 10 },
{ id: 201, kind: '2', name: '201', spec: '个', num: 10 },
{ id: 202, kind: '2', name: '202', spec: '个', num: 10 },
{ id: 203, kind: '2', name: '203', spec: '个', num: 10 }
])
const disposeOutgoingData = (e) => {
// 在函数中定义
/* const arrData = [
{ id: 101, kind: '1', name: '101', spec: '个', num: 10 },
{ id: 102, kind: '1', name: '102', spec: '个', num: 10 },
{ id: 201, kind: '2', name: '201', spec: '个', num: 10 },
{ id: 202, kind: '2', name: '202', spec: '个', num: 10 },
{ id: 203, kind: '2', name: '203', spec: '个', num: 10 }
] */
// 数据深拷贝后再操作
const arr = deepCopy(arrData.value)
let procedural = e.map((item) => {
let obj = arr.find((ent) => {
return item == ent.name
})
obj.quantityClaimed = ''
return obj
})
console.log(procedural, '')
if (GoodsClaimed.value.length == 0) {
procedural.filter((item) => {
GoodsClaimed.value.push(item)
})
} else if (procedural.length > GoodsClaimed.value.length) {
let existingIds = {}
for (let item of GoodsClaimed.value) {
existingIds[item.id] = true
}
for (let item of procedural) {
if (!existingIds[item.id]) {
GoodsClaimed.value.push(item)
}
}
} else if (procedural.length < GoodsClaimed.value.length) {
let matchingItems = []
for (let item of GoodsClaimed.value) {
if (procedural.some((i) => i.id === item.id)) {
matchingItems.push(item)
}
}
GoodsClaimed.value = matchingItems
}
}
// 深拷贝代码
const deepCopy = (data) => {
let datas = Array.isArray(data) ? [] : {}
if (Array.isArray(data)) {
data.forEach((v) => {
datas.push(deepCopy(v))
})
} else if (typeof data === 'object') {
for (const key in data) {
datas[key] = deepCopy(data[key])
}
// eslint-disable-next-line no-constant-condition
} else if (typeof data === 'string' || 'number' || 'boolean') return data
return datas
}