Commit 10d553b0 authored by 武广's avatar 武广

fix: 修改初始化数据

parent af0ee317
import React, { forwardRef } from 'react'; import React, { forwardRef } from 'react';
import { Checkbox } from 'antd'; import { Checkbox } from 'antd';
import { CaretRightOutlined, CaretDownOutlined, LoadingOutlined } from '@ant-design/icons'; import { RightOutlined, DownOutlined, LoadingOutlined } from '@ant-design/icons';
import debounce from 'lodash/debounce'; import debounce from 'lodash/debounce';
import styles from './index.less'; import styles from './index.less';
...@@ -8,11 +8,12 @@ const CustomTree = forwardRef(props => { ...@@ -8,11 +8,12 @@ const CustomTree = forwardRef(props => {
const { treeData } = props; const { treeData } = props;
const onChange = () => { const onChange = () => {
props.onChange(treeData.key, !treeData.checked, treeData.level); props.onChange(treeData.key, !treeData.checked, treeData.level, treeData.children);
}; };
const onVisible = debounce(e => { const onVisible = debounce(e => {
e.persist(); e.persist();
if (treeData.isLoading) return;
props.onVisibleChildren( props.onVisibleChildren(
treeData.key, treeData.key,
!treeData.visibleChildren, !treeData.visibleChildren,
...@@ -27,25 +28,28 @@ const CustomTree = forwardRef(props => { ...@@ -27,25 +28,28 @@ const CustomTree = forwardRef(props => {
} }
if (treeData.isLeaf) { if (treeData.isLeaf) {
return ( return (
<div onClick={onVisible}> <div onClick={onVisible} className={styles.CBIcon}>
{treeData.visibleChildren ? <CaretDownOutlined /> : <CaretRightOutlined />} {treeData.visibleChildren ? <DownOutlined /> : <RightOutlined />}
</div> </div>
); );
} }
return <span />; return <span />;
}; };
return ( return (
<div className={styles['ccheck-wrapper']} key={`key${treeData.key}`}> <div key={`key${treeData.key}`}>
<div className={styles['ccheck-box']}> <div className={styles['ccheck-box']}>
<div className={styles['ccheck-box--expand']}>{renderIcon()}</div> <div className={styles['ccheck-box--expand']}>{renderIcon()}</div>
<Checkbox <Checkbox
onChange={onChange} onChange={onChange}
indeterminate={!treeData.checked && treeData.indeterminate} indeterminate={!treeData.checked && treeData.indeterminate}
checked={treeData.checked} checked={treeData.checked}
> />
<div className={styles['ccheck-box--label']} onClick={onVisible}>
{props.label} {props.label}
{treeData.value && treeData.value.length > 0 ? `(${treeData.value.length})` : ''} {treeData.isLeaf && treeData.value && treeData.value.length > 0
</Checkbox> ? `(${treeData.value.length})`
: ''}
</div>
</div> </div>
</div> </div>
); );
......
...@@ -7,6 +7,15 @@ import CTreeNode from './CTreeNode'; ...@@ -7,6 +7,15 @@ import CTreeNode from './CTreeNode';
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 [initValue, setInitValue] = useState([]);
const initChildrenStatus = arr =>
arr.map(item => {
const obj = initValue.find(val => val.key === item.key) || {};
item.checked = obj.checked || item.checked || false;
item.indeterminate = obj.indeterminate || item.indeterminate || false;
return item;
});
// 获取子列表 // 获取子列表
const getChildrenList = list => { const getChildrenList = list => {
...@@ -14,7 +23,7 @@ const CustomTree = forwardRef(props => { ...@@ -14,7 +23,7 @@ const CustomTree = forwardRef(props => {
const findArr = childrens => { const findArr = childrens => {
childrens.forEach(node => { childrens.forEach(node => {
if (node.children && node.children.length) { if (node.children && node.children.length) {
node.visibleChildren && arr.push(node.children); node.visibleChildren && arr.push(initChildrenStatus(node.children, node.checked));
findArr(node.children); findArr(node.children);
} }
}); });
...@@ -84,22 +93,30 @@ const CustomTree = forwardRef(props => { ...@@ -84,22 +93,30 @@ const CustomTree = forwardRef(props => {
return list; return list;
}; };
// 更改子复选框状态
const updateChildren = (list, isChecked) => {
list.forEach(item => {
item.indeterminate = false;
item.checked = isChecked;
if (item.children && item.children.length) {
item.value = isChecked ? item.children.map(c => c.key) : [];
updateChildren(item.children, isChecked);
} else {
item.value = [];
}
});
};
// 追加子树 // 追加子树
const appendTreeData = (list, key, children) => const appendTreeData = (list, key, children, isChecked) =>
list.map(node => { list.forEach(node => {
if (node.key === key) { if (node.key === key) {
return { node.children = children.length ? children : [];
...node, isChecked && (node.value = children);
children: children.length ? children : undefined, updateChildren(node.children, isChecked);
}; } else if (node.children && node.children.length) {
} appendTreeData(node.children, key, children, isChecked);
if (node.children) {
return {
...node,
children: appendTreeData(node.children, key, children),
};
} }
return node;
}); });
// 更新子树显示隐藏状态 // 更新子树显示隐藏状态
...@@ -136,36 +153,27 @@ const CustomTree = forwardRef(props => { ...@@ -136,36 +153,27 @@ const CustomTree = forwardRef(props => {
return key; return key;
}; };
// 异步获取数据
const getSyncLoadChildrens = async (arr, ckey, parentChecked) => {
const res = await props.loadData({ key: ckey });
if (res && res.length) {
appendTreeData(arr, ckey, filterData(res, parentChecked), parentChecked);
}
};
// 改变子树显示隐藏状态事件 // 改变子树显示隐藏状态事件
const onVisibleChildren = async (ckey, visible, children, parentChecked) => { const onVisibleChildren = async (ckey, visible, children, parentChecked) => {
let arr = [...treeData]; const arr = [...treeData];
if (children && !children.length && typeof props.loadData === 'function') { if (children && !children.length && typeof props.loadData === 'function') {
ChangeVal(arr, ckey, true, 'isLoading'); ChangeVal(arr, ckey, true, 'isLoading');
setTreeData(arr); setTreeData(arr);
const res = await props.loadData({ key: ckey, children }); await getSyncLoadChildrens(arr, ckey, parentChecked);
if (res && res.length) {
arr = appendTreeData(arr, ckey, filterData(res, parentChecked));
}
} }
updateVisible(arr, ckey, visible); updateVisible(arr, ckey, visible);
setChildrenList(getChildrenList(arr)); setChildrenList(getChildrenList(arr));
setTreeData(arr); setTreeData(arr);
}; };
// 更改子复选框状态
const updateChildren = (list, isChecked) => {
list.forEach(item => {
item.indeterminate = false;
item.checked = isChecked;
if (item.children && item.children.length) {
item.value = isChecked ? item.children.map(c => c.key) : [];
updateChildren(item.children, isChecked);
} else {
item.value = isChecked ? [item.key] : [];
}
});
};
// 更改选中状态 // 更改选中状态
const changeChecked = (list, ckey, isChecked, pkey) => { const changeChecked = (list, ckey, isChecked, pkey) => {
let key = ''; let key = '';
...@@ -180,9 +188,9 @@ const CustomTree = forwardRef(props => { ...@@ -180,9 +188,9 @@ const CustomTree = forwardRef(props => {
node.checked = false; node.checked = false;
} else { } else {
node.checked = node.children.every(item => item.checked); node.checked = node.children.every(item => item.checked);
if (node.checked) { // if (node.checked) {
node.value = []; // node.value = [];
} // }
} }
key = pkey; key = pkey;
} }
...@@ -235,8 +243,11 @@ const CustomTree = forwardRef(props => { ...@@ -235,8 +243,11 @@ const CustomTree = forwardRef(props => {
}; };
// 切换选中状态事件 // 切换选中状态事件
const onChange = (ckey, isChecked, level) => { const onChange = async (ckey, isChecked, level, children) => {
const datas = [...treeData]; const datas = [...treeData];
if (isChecked && children && !children.length && typeof props.loadData === 'function') {
await getSyncLoadChildrens(datas, ckey, isChecked);
}
changeChecked(datas, ckey, isChecked); changeChecked(datas, ckey, isChecked);
const values = getCheckTreeValue(datas, isChecked); const values = getCheckTreeValue(datas, isChecked);
if (level === 1) { if (level === 1) {
...@@ -266,36 +277,21 @@ const CustomTree = forwardRef(props => { ...@@ -266,36 +277,21 @@ const CustomTree = forwardRef(props => {
} }
}; };
// const initTreeData = (arr = [], values = [], level) =>
// arr.map(item => {
// const valueObj = values.find(val => val.key === item.key) || {};
// console.log('valueObj.children :>> ', valueObj.children);
// const json = {
// value: valueObj.children || item.value || [],
// level,
// visibleChildren: false,
// checked: false,
// indeterminate: false,
// label: item[props.labelName || 'label'],
// key: item[props.keyName || 'key'],
// isLeaf: true,
// isLoading: false,
// };
// getIsChecked(item.key, json);
// if (item.children) {
// json.children = initTreeData(item.children, valueObj.children, level + 1);
// }
// return json;
// });
// 初始化数初始化 // 初始化数初始化
const initTreeValue = (arr = [], values = [], parentChecked, level = 1) => const initTreeValue = (arr = [], values = [], parentChecked, level = 1) => {
const getValues = (item, valueObj) => {
if (item.checked && item.children && item.children.length) {
return item.children.map(c => c.key);
}
return (valueObj.children || []).map(c => c.key);
};
arr.forEach(item => { arr.forEach(item => {
const valueObj = values.find(val => val.key === item.key) || {}; const valueObj = values.find(val => val.key === item.key) || {};
item.checked = item.checked =
(typeof parentChecked === 'boolean' && parentChecked) || valueObj.checked || false; (typeof parentChecked === 'boolean' && parentChecked) || valueObj.checked || false;
item.indeterminate = valueObj.indeterminate || false; item.indeterminate = valueObj.indeterminate || false;
item.value = valueObj.children || []; item.value = getValues(item, valueObj);
item.isLeaf = typeof item.isLeaf === 'boolean' ? item.isLeaf : true; item.isLeaf = typeof item.isLeaf === 'boolean' ? item.isLeaf : true;
item.isLoading = false; item.isLoading = false;
item.visibleChildren = item.visibleChildren || false; item.visibleChildren = item.visibleChildren || false;
...@@ -304,11 +300,29 @@ const CustomTree = forwardRef(props => { ...@@ -304,11 +300,29 @@ const CustomTree = forwardRef(props => {
initTreeValue(item.children, valueObj.children, item.checked, level + 1); initTreeValue(item.children, valueObj.children, item.checked, level + 1);
} }
}); });
};
const getInitValue = () => {
const arr = [];
const getDeepValue = list => {
list.forEach(item => {
const obj = { ...item };
delete obj.children;
arr.push(obj);
if (item.children && item.children.length) {
getDeepValue(item.children);
}
});
};
getDeepValue(props.value);
return arr;
};
useEffect(() => { useEffect(() => {
const datas = [...treeData]; const datas = [...treeData];
initTreeValue(datas, props.value); initTreeValue(datas, props.value);
setTreeData(datas); setTreeData(datas);
const arr = getInitValue();
setInitValue(arr);
}, [props.value]); }, [props.value]);
useEffect(() => { useEffect(() => {
......
...@@ -35,6 +35,13 @@ ...@@ -35,6 +35,13 @@
margin-left: 0; margin-left: 0;
} }
} }
&--label {
padding: 0 10px;
cursor: pointer;
}
}
.CBIcon {
font-size: 12px;
} }
.tree-children-box { .tree-children-box {
position: absolute; position: absolute;
......
...@@ -86,13 +86,12 @@ const AddAreaModal = props => { ...@@ -86,13 +86,12 @@ const AddAreaModal = props => {
} }
}); });
}; };
const onLoadData = async ({ key, children }) => { const onLoadData = async ({ key }) => {
const res = await areaList({ parentId: key }); const res = await areaList({ parentId: key });
return res || []; return res || [];
}; };
useEffect(() => { useEffect(() => {
// getAreaList();
if (props.templateData) { if (props.templateData) {
let arr = []; let arr = [];
const dealData = list => const dealData = list =>
...@@ -118,7 +117,7 @@ const AddAreaModal = props => { ...@@ -118,7 +117,7 @@ const AddAreaModal = props => {
title={props.templateData.status ? '编辑限制区域配送模板' : '添加限制区域配送模板'} title={props.templateData.status ? '编辑限制区域配送模板' : '添加限制区域配送模板'}
maskClosable={false} maskClosable={false}
visible={visible} visible={visible}
width="1000px" width="800px"
onCancel={() => onCancel()} onCancel={() => onCancel()}
onOk={() => handleOk()} onOk={() => handleOk()}
> >
......
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