Commit 7d9070cb authored by 武广's avatar 武广

feat: 添加初始化tree

parent 0d105a36
...@@ -8,7 +8,7 @@ const CustomTree = forwardRef(props => { ...@@ -8,7 +8,7 @@ const CustomTree = forwardRef(props => {
const { treeData } = props; const { treeData } = props;
const onChange = () => { const onChange = () => {
props.onChange(treeData.key, !treeData.checked); props.onChange(treeData.key, !treeData.checked, treeData.level);
}; };
const onVisible = debounce(e => { const onVisible = debounce(e => {
......
...@@ -3,13 +3,33 @@ import React, { useState, useEffect, forwardRef } from 'react'; ...@@ -3,13 +3,33 @@ import React, { useState, useEffect, forwardRef } from 'react';
import { Row, Col } from 'antd'; import { Row, Col } from 'antd';
import styles from './index.less'; import styles from './index.less';
import CTreeNode from './CTreeNode'; import CTreeNode from './CTreeNode';
// import { deepClone } from '@/utils/utils';
const CustomTree = forwardRef(props => { const CustomTree = forwardRef(props => {
const [treeData, setTreeData] = useState([]); const [treeData, setTreeData] = useState([]);
const [childrenList, setChildrenList] = useState([]); const [childrenList, setChildrenList] = useState([]);
const [treeValue, setTreeValue] = useState([]);
const getChildrenList = list => {
const arr = [];
const findArr = childrens => {
childrens.forEach(node => {
if (node.children && node.children.length) {
node.visibleChildren && arr.push(node.children);
findArr(node.children);
}
});
};
findArr(list);
return arr;
};
const ChangeVal = (list, key, v, keyName) => {
list.forEach(node => {
if (node.key === key) {
node[keyName] = v;
} else if (node.children && node.children.length) {
ChangeVal(node.children, key, v);
}
});
};
// 获取选中的值 // 获取选中的值
const getCheckValue = (list, isFrist) => { const getCheckValue = (list, isFrist) => {
const arr = []; const arr = [];
...@@ -24,14 +44,13 @@ const CustomTree = forwardRef(props => { ...@@ -24,14 +44,13 @@ const CustomTree = forwardRef(props => {
}; };
getChildrenCheckValue(list); getChildrenCheckValue(list);
}; };
// 获取默认值是否选中 // 获取默认值是否选中
const getIsChecked = (key, json) => { const getIsChecked = (key, json) => {
const checkfn = list => { const checkfn = list => {
list.forEach(item => { list.forEach(item => {
if (+item[props.valueKey || 'key'] === +key) { if (+item[props.valueKey || 'key'] === +key) {
json.checked = !!item.checked; json.checked = !!item.checked;
json.indeterminate = true; json.indeterminate = !item.checked;
json.value = getCheckValue(item.children, 1); json.value = getCheckValue(item.children, 1);
} else if (item.children) { } else if (item.children) {
checkfn(item.children); checkfn(item.children);
...@@ -40,69 +59,44 @@ const CustomTree = forwardRef(props => { ...@@ -40,69 +59,44 @@ const CustomTree = forwardRef(props => {
}; };
props.value && props.value.length && checkfn(props.value, json); props.value && props.value.length && checkfn(props.value, json);
}; };
const filterData = (arr, parentChecked) => {
const updateChildren = (list, isChecked) => { const list = [];
list.forEach(item => { arr.forEach(item => {
item.indeterminate = isChecked; const json = {
item.checked = isChecked; label: item.addrName,
if (item.children && item.children.length) { key: +item.addrId,
item.value = isChecked ? item.children.map(c => c.key) : []; level: item.addrLevel,
updateChildren(item.children, isChecked); value: [],
} else { checked: parentChecked || false,
item.value = isChecked ? [item.key] : []; indeterminate: false,
children: [],
isLeaf: true,
isLoading: false,
};
if (!parentChecked) {
getIsChecked(item.addrId, json);
} }
list.push(json);
}); });
return list;
}; };
const updateTreeData = list => { const appendTreeData = (list, key, children) =>
list.forEach(node => { list.map(node => {
let cksel = false; if (node.key === key) {
let cklen = 0; return {
const value = []; ...node,
if (node.children && node.children.length) { children: children.length ? children : undefined,
updateTreeData(node.children); };
let indeterminate = false;
node.children.forEach(item => {
if (node.checked || item.checked) {
value.push(item.key);
}
item.indeterminate && (indeterminate = true);
});
cklen = value.length;
node.checked = cklen === node.children.length;
cksel = cklen === node.children.length || indeterminate;
} }
node.indeterminate = cklen > 0 || cksel; if (node.children) {
node.value = value; return {
}); ...node,
}; children: appendTreeData(node.children, key, children),
};
const changeChecked = (list, ckey, isChecked, pkey) => {
let key = '';
list.forEach(node => {
if (node.key === ckey) {
node.checked = isChecked;
const values = [...treeValue];
if (isChecked) {
const obj = { ...node };
obj.children = [];
values.push(obj);
} else {
key = pkey;
const index = treeValue.findIndex(item => item.key === node.key);
index > -1 && values.splice(index, 1);
}
setTreeValue(values);
node.children && node.children.length && updateChildren(node.children, isChecked);
} else if (node.children && node.children.length) {
if (changeChecked(node.children, ckey, isChecked, node.key) === node.key) {
node.checked = false;
key = pkey;
}
} }
return node;
}); });
return key;
};
const updateVisibleChildren = (list, visible) => { const updateVisibleChildren = (list, visible) => {
list.forEach(item => { list.forEach(item => {
...@@ -136,98 +130,107 @@ const CustomTree = forwardRef(props => { ...@@ -136,98 +130,107 @@ const CustomTree = forwardRef(props => {
return key; return key;
}; };
const onChange = (ckey, isChecked) => { const onVisibleChildren = async (ckey, visible, children, parentChecked) => {
const datas = [...treeData]; let arr = [...treeData];
changeChecked(datas, ckey, isChecked); if (children && !children.length && typeof props.loadData === 'function') {
updateTreeData(datas); ChangeVal(arr, ckey, true, 'isLoading');
// updateVisible(datas, ckey, true); setTreeData(arr);
console.log('datas :>> ', datas); const res = await props.loadData({ key: ckey, children });
console.log('treeValue :>> ', treeValue); if (res && res.length) {
// props.onChange(getCheckValue(datas)); arr = appendTreeData(arr, ckey, filterData(res, parentChecked));
setTreeData(datas);
// setTimeout(() => {
// props.onChange(treeValue);
// }, 10);
};
const filterData = (arr, parentChecked) => {
const list = [];
arr.forEach(item => {
const json = {
label: item.addrName,
key: +item.addrId,
level: item.addrLevel,
value: [],
checked: parentChecked || false,
indeterminate: false,
children: [],
isLeaf: true,
isLoading: false,
};
if (!parentChecked) {
getIsChecked(item.addrId, json);
} }
list.push(json); }
}); updateVisible(arr, ckey, visible);
return list; setChildrenList(getChildrenList(arr));
setTreeData(arr);
}; };
const appendTreeData = (list, key, children) => const updateChildren = (list, isChecked) => {
list.map(node => { list.forEach(item => {
if (node.key === key) { item.indeterminate = !isChecked;
return { item.checked = isChecked;
...node, if (item.children && item.children.length) {
children: children.length ? children : undefined, item.value = isChecked ? item.children.map(c => c.key) : [];
}; updateChildren(item.children, isChecked);
} } else {
if (node.children) { item.value = isChecked ? [item.key] : [];
return {
...node,
children: appendTreeData(node.children, key, children),
};
} }
return node;
}); });
};
const ChangeVal = (list, key, v, keyName) => { const changeChecked = (list, ckey, isChecked, pkey) => {
let key = '';
list.forEach(node => { list.forEach(node => {
if (node.key === key) { if (node.key === ckey) {
node[keyName] = v; node.checked = isChecked;
key = pkey;
node.children && node.children.length && updateChildren(node.children, isChecked);
} else if (node.children && node.children.length) { } else if (node.children && node.children.length) {
ChangeVal(node.children, key, v); if (changeChecked(node.children, ckey, isChecked, node.key) === node.key) {
if (!isChecked) {
node.checked = false;
} else {
node.checked = node.children.every(item => item.checked);
if (node.checked) {
node.value = [];
// updateChildren(node.children, true);
// console.log('node :>> ', ...node.children);
}
}
key = pkey;
node.indeterminate = !node.checked;
}
} }
}); });
return key;
}; };
const getChildrenList = list => { // 获取选中的值
const getCheckTreeValue = list => {
const arr = []; const arr = [];
const findArr = childrens => { const getChildrenCheckValue = (childrens, json, values = []) => {
childrens.forEach(node => { childrens.forEach(item => {
if (node.children && node.children.length) { if (item.checked || item.indeterminate) {
node.visibleChildren && arr.push(node.children); const obj = { ...item };
findArr(node.children); obj.children = [];
json.children.push(obj);
if (!item.checked) {
const valueArr = values.find(val => val.key === item.key) || {};
if (item.children && item.children.length) {
getChildrenCheckValue(item.children, obj, valueArr.children);
} else if (valueArr && valueArr.key) {
obj.children = valueArr.children;
}
}
} }
}); });
}; };
findArr(list); list.forEach(item => {
if (item.checked || item.indeterminate) {
const obj = { ...item };
obj.children = [];
if (!item.checked) {
const valueArr = props.value.find(val => val.key === item.key) || {};
if (item.children && item.children.length) {
getChildrenCheckValue(item.children, obj, valueArr.children);
} else if (valueArr && valueArr.key) {
obj.children = valueArr.children;
}
}
arr.push(obj);
}
});
return arr; return arr;
}; };
const onVisibleChildren = async (ckey, visible, children, parentChecked) => { const onChange = (ckey, isChecked, level) => {
let arr = [...treeData]; const datas = [...treeData];
console.log('arr :>> ', arr); changeChecked(datas, ckey, isChecked);
if (children && !children.length && typeof props.loadData === 'function') { const values = getCheckTreeValue(datas, isChecked);
ChangeVal(arr, ckey, true, 'isLoading'); if (level === 1) {
setTreeData(arr); onVisibleChildren('', false);
const res = await props.loadData({ key: ckey, children });
if (res && res.length) {
arr = appendTreeData(arr, ckey, filterData(res, parentChecked));
}
} }
updateVisible(arr, ckey, visible); props.onChange(values);
updateTreeData(arr);
setChildrenList(getChildrenList(arr));
setTreeData(arr);
}; };
const renderTreeNodes = data => const renderTreeNodes = data =>
...@@ -249,25 +252,6 @@ const CustomTree = forwardRef(props => { ...@@ -249,25 +252,6 @@ const CustomTree = forwardRef(props => {
} }
}; };
const fitTreeValue = () => {
const arr = [];
const fitChildrenTreeValue = list => {
list.forEach(item => {
if (typeof item.checked === 'boolean') {
if (item.checked) {
arr.push(item);
} else if (item.children && item.children.length) {
fitChildrenTreeValue(item.children);
}
} else {
arr.push(item);
}
});
};
fitChildrenTreeValue(props.value);
setTreeValue(arr);
};
const initTreeData = (arr = [], level) => const initTreeData = (arr = [], level) =>
arr.map(item => { arr.map(item => {
const json = { const json = {
...@@ -288,20 +272,21 @@ const CustomTree = forwardRef(props => { ...@@ -288,20 +272,21 @@ const CustomTree = forwardRef(props => {
return json; return json;
}); });
const initTreeValue = (arr = []) => const initTreeValue = (arr = [], values = [], parentChecked) =>
arr.forEach(item => { arr.forEach(item => {
item.checked = props.value.some(val => +val[props.valueKey || 'key'] === +item.key); const valueObj = values.find(val => val.key === item.key) || {};
if (item.children) { item.checked =
initTreeValue(item.children); (typeof parentChecked === 'boolean' && parentChecked) || valueObj.checked || false;
item.indeterminate = valueObj.indeterminate || false;
item.value = valueObj.children || [];
if (item.children && item.children.length) {
initTreeValue(item.children, valueObj.children, item.checked);
} }
}); });
useEffect(() => { useEffect(() => {
const datas = [...treeData]; const datas = [...treeData];
console.log('props.value :>> ', props.value); initTreeValue(datas, props.value);
fitTreeValue();
initTreeValue(datas);
updateTreeData(datas);
setTreeData(datas); setTreeData(datas);
}, [props.value]); }, [props.value]);
...@@ -310,6 +295,7 @@ const CustomTree = forwardRef(props => { ...@@ -310,6 +295,7 @@ const CustomTree = forwardRef(props => {
setTreeData(arr); setTreeData(arr);
}, [props.treeData]); }, [props.treeData]);
// 委托 - 点击别的地方关闭子层
useEffect(() => { useEffect(() => {
window.addEventListener('mouseup', handleMouseUp); window.addEventListener('mouseup', handleMouseUp);
return () => { return () => {
...@@ -317,14 +303,6 @@ const CustomTree = forwardRef(props => { ...@@ -317,14 +303,6 @@ const CustomTree = forwardRef(props => {
}; };
}, [treeData]); }, [treeData]);
useEffect(
e => {
console.log('e :>> ', e);
// props.onChange(treeValue);
},
[treeValue],
);
return ( return (
<div className={styles['tree-box']} id="my-custom-tree-box"> <div className={styles['tree-box']} id="my-custom-tree-box">
<Row justify="space-between"> <Row justify="space-between">
......
...@@ -48,15 +48,22 @@ const AddAreaModal = props => { ...@@ -48,15 +48,22 @@ const AddAreaModal = props => {
const handleOk = () => { const handleOk = () => {
validateFields(async (error, fieldsValue) => { validateFields(async (error, fieldsValue) => {
const newData = []; const newData = [];
console.log('fieldsValue :>> ', fieldsValue); const getValues = list => {
fieldsValue.list.map(itemData => list.forEach(itemData => {
newData.push({ if (itemData.checked) {
addressId: itemData.key, newData.push({
addressLevel: itemData.level, addressId: itemData.key,
addressName: itemData.label, addressLevel: itemData.level,
}), addressName: itemData.label,
); });
} else if (itemData.children && itemData.children.length) {
getValues(itemData.children);
}
});
};
if (!error) { if (!error) {
console.log('fieldsValue :>> ', fieldsValue);
getValues(fieldsValue.list);
if (props.templateData.status) { if (props.templateData.status) {
const data = await forbiddenAddress({ const data = await forbiddenAddress({
templateId: props.templateData.id, templateId: props.templateData.id,
...@@ -91,6 +98,9 @@ const AddAreaModal = props => { ...@@ -91,6 +98,9 @@ const AddAreaModal = props => {
let arr = []; let arr = [];
const dealData = list => const dealData = list =>
list.map(item => { list.map(item => {
item.key = +item.addressId;
item.label = item.addressName;
item.indeterminate = !item.isForbidden;
item.checked = item.isForbidden; item.checked = item.isForbidden;
item.children && item.children.length && dealData(item.children); item.children && item.children.length && dealData(item.children);
return item; return item;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment