vxe-table
vxe-table copied to clipboard
Checkfield 模式的树形 勾选应重构为多种状态
这个需求解决了什么问题:
现有逻辑,勾选 true 不勾选和半选都是false 或者undefined 然而维护起来难受,很多时候需要半选状态为true之类的有效统计。
重构建议是废弃checkField 使用checkStatusField 默认='checkStatus' 勾选为1 不选为0 半选为2 维护数值渲染checkbox样式。 这块的代码应该会好维护很多很多。 甚至飞checkField模式
建议的 API 是什么样的:
checkboxConfig:{checkStatusField :'checkStatus'}
获取半选和勾选数据 Xe-utils.map(treeData,row=>!!row.checkStatus) 获取勾选数据 Xe-utils.map(treeData,row=>1===row.checkStatus) 。。。
是否已有其他不错的替代方案:
现有解决类似问题的挣扎:
const checkHalf = (row: VxeTableDataRow) =>
row.children &&
row.children.length &&
(row.children.some((s: VxeTableDataRow) => checkHalf(s)) ||
(row.children.some((r: VxeTableDataRow) => r.selected) &&
row.children.some((r: VxeTableDataRow) => !r.selected)));
const treeData: Partial<Access>[] = await fetchAccessTree();
XEUtils.eachTree(treeData, (item) => {
if (item.selected) {
item.selected = !checkHalf(item);
}
});
accessTreeData.value = treeData;
const selectedIds: string[] = [];
XEUtils.eachTree(distributionData.value, (row) => {
if (row.selected || checkHalf(row)) {
selectedIds.push(row.resCode || '');
}
});
bindResources({ id: permissionId.value, resCodes: selectedIds }).then((res) => {
console.log(res);
});
v4.5 开始默认的方式已经接近 checkbox-config.checkField 的渲染性能,2种方式都能用,渲染性能差别不太大
v4.5 开始 checkbox-config.checkField 的渲染性能已经不如默认的了,所以也没有必要再用了
并不是用checkField 他的问题很大我知道的,只是希望逻辑上有更好区分半选状态的。 当默认模式下也无法很精确拿到带半选的树形选择结果。 但是status这套是可以的。 因为看到最近的代码在重构这方面,但是还有一些问题,我本地的版本适配checkField过程中发现其实一个多状态的field能解决很多问题,所以有了这个需求
如果需要属性绑定可以使用 checkbox-config.checkField 和 checkbox-config.indeterminateField
但是回显的时候只有选中的回显 半选的不回显 又解决吗,3.8.7的版本