assistant-note/src/components/ItemTree/index.jsx

172 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, {useEffect, useMemo, useState} from 'react';
import {Input, Tree} from 'antd';
import {FolderOutlined, FileMarkdownOutlined,FileOutlined} from '@ant-design/icons';
import "./index.less"
const {Search} = Input;
import store from "../../redux/store";
import {clickFile} from "../../redux/clickFile_reducer";
const defaultData = [];
// 将树平铺用于查找
const dataList = [];
const generateList = (data) => {
for (let i = 0; i < data.length; i++) {
const node = data[i];
const {key, title, icon} = node;
dataList.push({
key,
title,
icon
});
if (node.children) {
generateList(node.children);
}
}
};
generateList(defaultData);
const getParentKey = (key, tree) => {
let parentKey;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.children) {
if (node.children.some((item) => item.key === key)) {
parentKey = node.key;
} else if (getParentKey(key, node.children)) {
parentKey = getParentKey(key, node.children);
}
}
}
return parentKey;
};
function generateChildList(fileList) {
const result = []
for (let i = 0; i < fileList.length; i++) {
const {fileName, filePath, dirFlag} = fileList[i];
result.push({
"key": filePath,
"title": fileName,
"icon": dirFlag?<FolderOutlined/>:fileName.endsWith(".md")?<FileMarkdownOutlined/>:<FileOutlined />,
"dirFlag": dirFlag,
"children": []
});
}
return result;
}
const ItemTree = () => {
const [expandedKeys, setExpandedKeys] = useState([]);
const [searchValue, setSearchValue] = useState('');
const [defaultValueState, setDefaultValueState] = useState([]);
const [autoExpandParent, setAutoExpandParent] = useState(true);
useEffect(() => {
store.subscribe(() => {
let fileDirDate = store.getState().dirMessage.data;
if (fileDirDate.length===0){
return
}
console.log("打开目录1fileDirDate:", fileDirDate)
for (let i = 0; i < fileDirDate.length; i++) {
const node = fileDirDate[i];
console.log("node:", node)
const {fileName, filePath, childList, dirFlag} = node;
const childListM = []
if (childList.length > 0) {
childListM.push(...generateChildList(childList));
}
if (defaultData.filter(fileMessage =>
fileMessage.key === filePath
).length === 0) {
defaultData.push({
"key": filePath,
"title": fileName,
"icon": <FolderOutlined/>,
"dirFlag": dirFlag,
"children": childListM
});
}
}
console.log("Array.from(new Set(defaultData)):", Array.from(new Set(defaultData)))
setDefaultValueState(Array.from(new Set(defaultData)))
})
}, [])
const onExpand = (newExpandedKeys) => {
setExpandedKeys(newExpandedKeys);
setAutoExpandParent(false);
};
const onChange = (e) => {
const {value} = e.target;
const newExpandedKeys = dataList
.map((item) => {
if (item.title.indexOf(value) > -1) {
return getParentKey(item.key, defaultData);
}
return null;
})
.filter((item, i, self) => !!(item && self.indexOf(item) === i));
setExpandedKeys(newExpandedKeys);
setSearchValue(value);
setAutoExpandParent(true);
};
const onSelect = (selectedKeys, e) => {
if (e.selected && !e.node.dirFlag) {
console.log('onSelect.selectedKeys', selectedKeys, e)
store.dispatch(clickFile({"fileName": e.node.title, "filePath": e.node.key}))
}
}
// const treeData = useMemo(() => {
// const loop = (data) =>
// data.map((item) => {
// const strTitle = item.title;
// const index = strTitle.indexOf(searchValue);
// const beforeStr = strTitle.substring(0, index);
// const afterStr = strTitle.slice(index + searchValue.length);
// const title =
// index > -1 ? (
// <span>{beforeStr}
// <span className="site-tree-search-value">{searchValue}</span>{afterStr}</span>
// ) : (
// <span>{strTitle}</span>
// );
// if (item.children) {
// return {
// title,
// key: item.key,
// icon: item.icon,
// children: loop(item.children),
// };
// }
// return {
// title,
// icon: item.icon,
// key: item.key,
// };
// });
// return loop(defaultData);
// }, [searchValue]);
return (
<div>
<Search
style={{marginBottom: 8,}}
placeholder="Search"
onChange={onChange}
/>
<Tree
// 展开/收起节点时触发
onExpand={onExpand}
//(受控)展开指定的树节点
expandedKeys={expandedKeys}
// 是否自动展开父节点
autoExpandParent={autoExpandParent}
showIcon={true}
// treeNodes 数据,如果设置则不需要手动构造 TreeNode 节点key 在整个树范围内唯一)
treeData={defaultValueState}
onSelect={onSelect}
/>
</div>
);
};
export default ItemTree;