Commit af0ee317 authored by 武广's avatar 武广

fix: 更新子树半选状态

parent d0e15cba
...@@ -8,6 +8,7 @@ const CustomTree = forwardRef(props => { ...@@ -8,6 +8,7 @@ const CustomTree = forwardRef(props => {
const [treeData, setTreeData] = useState([]); const [treeData, setTreeData] = useState([]);
const [childrenList, setChildrenList] = useState([]); const [childrenList, setChildrenList] = useState([]);
// 获取子列表
const getChildrenList = list => { const getChildrenList = list => {
const arr = []; const arr = [];
const findArr = childrens => { const findArr = childrens => {
...@@ -21,6 +22,7 @@ const CustomTree = forwardRef(props => { ...@@ -21,6 +22,7 @@ const CustomTree = forwardRef(props => {
findArr(list); findArr(list);
return arr; return arr;
}; };
// 更改属性值
const ChangeVal = (list, key, v, keyName) => { const ChangeVal = (list, key, v, keyName) => {
list.forEach(node => { list.forEach(node => {
if (node.key === key) { if (node.key === key) {
...@@ -59,6 +61,7 @@ const CustomTree = forwardRef(props => { ...@@ -59,6 +61,7 @@ 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 filterData = (arr, parentChecked) => {
const list = []; const list = [];
arr.forEach(item => { arr.forEach(item => {
...@@ -81,6 +84,7 @@ const CustomTree = forwardRef(props => { ...@@ -81,6 +84,7 @@ const CustomTree = forwardRef(props => {
return list; return list;
}; };
// 追加子树
const appendTreeData = (list, key, children) => const appendTreeData = (list, key, children) =>
list.map(node => { list.map(node => {
if (node.key === key) { if (node.key === key) {
...@@ -98,6 +102,7 @@ const CustomTree = forwardRef(props => { ...@@ -98,6 +102,7 @@ const CustomTree = forwardRef(props => {
return node; return node;
}); });
// 更新子树显示隐藏状态
const updateVisibleChildren = (list, visible) => { const updateVisibleChildren = (list, visible) => {
list.forEach(item => { list.forEach(item => {
item.visibleChildren = false; item.visibleChildren = false;
...@@ -108,6 +113,7 @@ const CustomTree = forwardRef(props => { ...@@ -108,6 +113,7 @@ const CustomTree = forwardRef(props => {
}); });
}; };
// 更新显示隐藏状态
const updateVisible = (list, ckey, visible, pkey) => { const updateVisible = (list, ckey, visible, pkey) => {
let key = ''; let key = '';
list.forEach(node => { list.forEach(node => {
...@@ -130,6 +136,7 @@ const CustomTree = forwardRef(props => { ...@@ -130,6 +136,7 @@ const CustomTree = forwardRef(props => {
return key; return key;
}; };
// 改变子树显示隐藏状态事件
const onVisibleChildren = async (ckey, visible, children, parentChecked) => { const onVisibleChildren = async (ckey, visible, children, parentChecked) => {
let arr = [...treeData]; let arr = [...treeData];
if (children && !children.length && typeof props.loadData === 'function') { if (children && !children.length && typeof props.loadData === 'function') {
...@@ -145,9 +152,10 @@ const CustomTree = forwardRef(props => { ...@@ -145,9 +152,10 @@ const CustomTree = forwardRef(props => {
setTreeData(arr); setTreeData(arr);
}; };
// 更改子复选框状态
const updateChildren = (list, isChecked) => { const updateChildren = (list, isChecked) => {
list.forEach(item => { list.forEach(item => {
item.indeterminate = !isChecked; item.indeterminate = false;
item.checked = isChecked; item.checked = isChecked;
if (item.children && item.children.length) { if (item.children && item.children.length) {
item.value = isChecked ? item.children.map(c => c.key) : []; item.value = isChecked ? item.children.map(c => c.key) : [];
...@@ -158,12 +166,12 @@ const CustomTree = forwardRef(props => { ...@@ -158,12 +166,12 @@ const CustomTree = forwardRef(props => {
}); });
}; };
// 更改选中状态
const changeChecked = (list, ckey, isChecked, pkey) => { const changeChecked = (list, ckey, isChecked, pkey) => {
let key = ''; let key = '';
list.forEach(node => { list.forEach(node => {
if (node.key === ckey) { if (node.key === ckey) {
node.checked = isChecked; node.checked = isChecked;
// node.indeterminate = !node.checked;
key = pkey; key = pkey;
node.children && node.children.length && updateChildren(node.children, isChecked); node.children && node.children.length && updateChildren(node.children, isChecked);
} else if (node.children && node.children.length) { } else if (node.children && node.children.length) {
...@@ -174,18 +182,16 @@ const CustomTree = forwardRef(props => { ...@@ -174,18 +182,16 @@ const CustomTree = forwardRef(props => {
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 = [];
// updateChildren(node.children, true);
// console.log('node :>> ', ...node.children);
} }
} }
key = pkey; key = pkey;
} }
}
if (node.checked) { if (node.checked) {
node.indeterminate = false; node.indeterminate = false;
} else if (node.children && node.children.length) { } else if (node.children && node.children.length) {
node.indeterminate = node.children.some(item => item.checked || item.indeterminate); node.indeterminate = node.children.some(item => item.checked || item.indeterminate);
} }
}
}); });
return key; return key;
}; };
...@@ -228,6 +234,7 @@ const CustomTree = forwardRef(props => { ...@@ -228,6 +234,7 @@ const CustomTree = forwardRef(props => {
return arr; return arr;
}; };
// 切换选中状态事件
const onChange = (ckey, isChecked, level) => { const onChange = (ckey, isChecked, level) => {
const datas = [...treeData]; const datas = [...treeData];
changeChecked(datas, ckey, isChecked); changeChecked(datas, ckey, isChecked);
...@@ -238,6 +245,7 @@ const CustomTree = forwardRef(props => { ...@@ -238,6 +245,7 @@ const CustomTree = forwardRef(props => {
props.onChange(values); props.onChange(values);
}; };
// 渲染子树
const renderTreeNodes = data => const renderTreeNodes = data =>
data && data &&
data.map(item => ( data.map(item => (
...@@ -250,6 +258,7 @@ const CustomTree = forwardRef(props => { ...@@ -250,6 +258,7 @@ const CustomTree = forwardRef(props => {
/> />
)); ));
// 隐藏所有子树
const handleMouseUp = e => { const handleMouseUp = e => {
const isCur = e.path.some(item => item.id === 'my-custom-tree-box'); const isCur = e.path.some(item => item.id === 'my-custom-tree-box');
if (!isCur) { if (!isCur) {
...@@ -279,6 +288,7 @@ const CustomTree = forwardRef(props => { ...@@ -279,6 +288,7 @@ const CustomTree = forwardRef(props => {
// return json; // return json;
// }); // });
// 初始化数初始化
const initTreeValue = (arr = [], values = [], parentChecked, level = 1) => const initTreeValue = (arr = [], values = [], parentChecked, level = 1) =>
arr.forEach(item => { arr.forEach(item => {
const valueObj = values.find(val => val.key === item.key) || {}; const valueObj = values.find(val => val.key === item.key) || {};
......
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