|
@@ -79,17 +79,35 @@ const SelectionCell: FunctionalComponent<SelectionCellProps> = ({ value, interme
|
|
|
return <ElCheckbox onChange={onChange} modelValue={value} indeterminate={intermediate} />;
|
|
|
};
|
|
|
// 递归改变选中状态
|
|
|
-const changeChecked = (obj: any, value: string | number | boolean) => {
|
|
|
- if (!obj) return;
|
|
|
- if (obj.children && obj.children.length) {
|
|
|
- obj.children.forEach((v: any) => {
|
|
|
- v.checked = value;
|
|
|
- if (obj.children && obj.children.length) {
|
|
|
- changeChecked(v.children, value);
|
|
|
- return (v.checked = value);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
+const changeChecked = (arr: unknown, value: string | number | boolean) => {
|
|
|
+ if (!arr || !arr.length || !Array.isArray(arr)) return;
|
|
|
+ arr.forEach((v: any) => {
|
|
|
+ v.checked = value;
|
|
|
+ if (v.children && v.children.length) {
|
|
|
+ changeChecked(v.children, value);
|
|
|
+ }
|
|
|
+ return (v.checked = value);
|
|
|
+ });
|
|
|
+};
|
|
|
+// 递归判断全部选中
|
|
|
+const isAllCheck = (arr: unknown) => {
|
|
|
+ if (!arr || !arr.length || !Array.isArray(arr)) return false;
|
|
|
+ return arr.every((v: any) => {
|
|
|
+ if (v.checked) return true;
|
|
|
+ if (v.children && v.children.length) {
|
|
|
+ return isAllCheck(v.children);
|
|
|
+ }
|
|
|
+ });
|
|
|
+};
|
|
|
+// 递归判断是否有选中
|
|
|
+const isCheck = (arr: unknown) => {
|
|
|
+ if (!arr || !arr.length || !Array.isArray(arr)) return false;
|
|
|
+ return arr.some((v: any) => {
|
|
|
+ if (v.checked) return true;
|
|
|
+ if (v.children && v.children.length) {
|
|
|
+ return isCheck(v.children);
|
|
|
+ }
|
|
|
+ });
|
|
|
};
|
|
|
// 定义变量内容
|
|
|
const state = reactive<any>({
|
|
@@ -106,21 +124,21 @@ const state = reactive<any>({
|
|
|
width: 50,
|
|
|
cellRenderer: ({ rowData }) => {
|
|
|
const onChange = (value: CheckboxValueType) => {
|
|
|
- console.log(rowData);
|
|
|
- // changeChecked(rowData, value);
|
|
|
- return (rowData.checked = value);
|
|
|
+ rowData.checked = value;
|
|
|
+ return changeChecked(rowData.children, value);
|
|
|
};
|
|
|
- return <SelectionCell value={rowData.checked} onChange={onChange} />;
|
|
|
+ const containsChecked = isCheck(rowData.children);
|
|
|
+ const allSelected = isAllCheck(rowData.children);
|
|
|
+ return <SelectionCell value={rowData.checked || allSelected} intermediate={containsChecked && !allSelected} onChange={onChange} />;
|
|
|
},
|
|
|
headerCellRenderer: () => {
|
|
|
const _data = unref(state.tableData);
|
|
|
- const onChange = (value: CheckboxValueType) =>
|
|
|
- (state.tableData = _data.map((row) => {
|
|
|
- row.checked = value;
|
|
|
- return row;
|
|
|
- }));
|
|
|
- const allSelected = _data.every((row) => row.checked);
|
|
|
- const containsChecked = _data.some((row) => row.checked);
|
|
|
+ const onChange = (value: CheckboxValueType) => {
|
|
|
+ return changeChecked(_data, value);
|
|
|
+ };
|
|
|
+
|
|
|
+ const allSelected = isAllCheck(_data);
|
|
|
+ const containsChecked = isCheck(_data);
|
|
|
|
|
|
return <SelectionCell value={allSelected} intermediate={containsChecked && !allSelected} onChange={onChange} />;
|
|
|
},
|