最近在做项目时用到了递归调用,是表格树勾选上级需要把下级的同时勾选上,由于使用的是低代码平台,平台那边暂不提供这种功能,所以只能自己写了。 代码如下:
//onSelect事件
viewModal.on(result.tableUi.key, 'onSelect', async params => {
// todo 如果不是末级,则执行两次
let selectedData = params.data
if (Array.isArray(selectedData)) {
return
}
//分以下4种情况,
1、有子级,且勾选
2、有子级,不勾选
3、无子级,勾选 勾选,只处理传递给后端的数据即可,后端只需要末级节点的数据,非末级不需要,result.checkList是传给后端的数据
4、无子级,不勾选 不勾选,则从result.checkList中去除
console.log('params: ', params.data)
if (selectedData.children && selectedData._check === true) {
result.setSelectRows(selectedData.children)
result.checkedList = result.filterData(result.checkedList, 'id')
viewModal.get(result.tableUi.key).setSelectRow(result.checkedList, true)
result.checkList = result.checkedList.filter(item => item.isEnd === '1')
result.checkList = result.filterData(result.checkList, 'id')
} else if (selectedData.children && selectedData._check === false) {
// 如果父级不勾选,则子级也不勾选
result.setSelectRows(selectedData.children)
viewModal.get(result.tableUi.key).setSelectRow(result.checkedList, false)
result.checkedList = result.filterData(result.checkedList, 'id')
result.checkList = result.checkedList.filter(item => item.isEnd === '1' && item._check === true)
result.checkList = result.filterData(result.checkList, 'id')
} else if (!selectedData.children && selectedData._check === true) {
result.checkList.push(selectedData)
result.checkList = result.filterData(result.checkList, 'id')
} else if (!selectedData.children && selectedData._check === false) {
result.checkList.splice(
result.checkList.findIndex(item => item.id === selectedData.id),
1
)
}
console.log('result.checkedList: ', result.checkedList, result.checkList)
})
//给checkedList push值
setSelectRows(data) {
data.forEach(item => {
result.checkedList.push(item)
if (item.children) {
this.setSelectRows(item.children) //如果有children,就再调用此方法即可
}
})
},
// 数据去重
filterData(data, key) {
let arr = data
if (data && data.length) {
arr = data.filter((x, index) => {
let arrKey = []
data.forEach(item => {
arrKey.push(item[key])
})
return arrKey.indexOf(x[key]) === index
})
}
return arr
},