tdesign-vue-next
Version:
TDesign Component for vue-next
1 lines • 7.1 kB
Source Map (JSON)
{"version":3,"file":"useTreeNodes.mjs","sources":["../../../../components/tree/hooks/useTreeNodes.tsx"],"sourcesContent":["import { ref, watch, TypeCreateElement, privateKey, TypeVNode } from '../utils/adapt';\nimport { TypeTreeRow, TypeTreeNode, TypeTreeState } from '../types';\nimport TreeItem from '../tree-item';\nimport useTreeEvents from './useTreeEvents';\n\n// tree 节点列表渲染\nexport default function useTreeNodes(state: TypeTreeState) {\n const { store, scope, allNodes, nodes, virtualConfig } = state;\n const { handleClick, handleChange } = useTreeEvents(state);\n const nodesEmpty = ref(false);\n // 用于存储已呈现节点的缓存\n const cacheMap = new Map();\n\n const refresh = () => {\n allNodes.value = store.getNodes();\n };\n\n const refreshVisibleNodes = () => {\n const isVirtual = virtualConfig?.isVirtualScroll.value;\n if (isVirtual) return;\n // 非虚拟滚动,渲染可视节点\n const list: TypeTreeNode[] = [];\n // 非虚拟滚动,缓存曾经展示过的节点\n let hasVisibleNode = false;\n allNodes.value.forEach((node: TypeTreeNode) => {\n if (node.visible) {\n // 曾经展示过的节点加入缓存,避免再次创建\n hasVisibleNode = true;\n cacheMap.set(node.value, node.value);\n }\n if (cacheMap.has(node.value)) {\n // 创建的节点是缓存的节点\n list.push(node);\n }\n });\n cacheMap.forEach((value) => {\n // 在缓存中清理结构变化后不存在的节点\n if (!store.getNode(value)) {\n cacheMap.delete(value);\n }\n });\n // 渲染为平铺列表\n nodes.value = list;\n nodesEmpty.value = !hasVisibleNode;\n };\n\n const refreshVirtualNodes = () => {\n const isVirtual = virtualConfig?.isVirtualScroll.value;\n if (!isVirtual) return;\n // 虚拟滚动只渲染可见节点\n const list = virtualConfig.visibleData.value;\n nodes.value = list;\n nodesEmpty.value = list.length <= 0;\n };\n\n // 创建单个 tree 节点\n const renderItem = (h: TypeCreateElement, node: TypeTreeRow, index: number, stateId: string) => {\n const rowIndex = node.VIRTUAL_SCROLL_INDEX || index;\n const nodeUniqueId = node[privateKey];\n // vue3 中,不使用动画时,传递 node, 或者单纯传递 itemKey 无法触发 treeItem 的 render 方法\n // 考虑到有必要对所有节点状态更新,所以添加 stateId 属性,专门用于触发 treeItem 的 render 方法\n // 使用动画时,transition group 触发了所有节点的 render 方法,回头可以研究看下更合适的方案\n // 未来也可以根据节点数据的具体更新状态,来决定节点更新与否\n // 考虑到 value 值有冲突可能,所以使用 privateKey 来作为节点标记\n const treeItem = (\n <TreeItem\n key={nodeUniqueId}\n rowIndex={rowIndex}\n stateId={stateId}\n itemKey={nodeUniqueId}\n treeScope={scope}\n onClick={handleClick}\n onChange={handleChange}\n />\n );\n return treeItem;\n };\n\n const renderTreeNodes = (h: TypeCreateElement) => {\n const stateId = `render-${new Date().getTime()}`;\n const treeNodeViews: TypeVNode[] = nodes.value.map((node: TypeTreeNode, index) =>\n renderItem(h, node, index, stateId),\n );\n return treeNodeViews;\n };\n\n watch(allNodes, refreshVisibleNodes);\n watch(virtualConfig.visibleData, refreshVirtualNodes);\n\n refresh();\n refreshVisibleNodes();\n refreshVirtualNodes();\n store.emitter.on('update', refresh);\n\n return {\n nodesEmpty,\n renderTreeNodes,\n };\n}\n"],"names":["useTreeNodes","state","store","scope","allNodes","nodes","virtualConfig","_useTreeEvents","useTreeEvents","handleClick","handleChange","nodesEmpty","ref","cacheMap","Map","refresh","value","getNodes","refreshVisibleNodes","isVirtual","isVirtualScroll","list","hasVisibleNode","forEach","node","visible","set","has","push","getNode","refreshVirtualNodes","visibleData","length","renderItem","h","index","stateId","rowIndex","VIRTUAL_SCROLL_INDEX","nodeUniqueId","privateKey","treeItem","renderTreeNodes","concat","Date","getTime","treeNodeViews","map","watch","emitter","on"],"mappings":"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"}