xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 14.1 kB
Source Map (JSON)
{"version":3,"file":"useTree.mjs","sources":["../../src/tree/useTree.tsx"],"sourcesContent":["import { ref, watch, toRefs, nextTick } from 'vue';\nimport isArray from 'lodash/isArray';\nimport { TdTreeProps } from './type';\nimport TreeItem from './tree-item';\n\nimport TreeStore from '../_common/js/tree/tree-store';\nimport TreeNode from '../_common/js/tree/tree-node';\n\nimport useDefaultValue from '../hooks/useDefaultValue';\nimport useVModel from '../hooks/useVModel';\nimport useOnDrag from './hooks/useOnDrag';\nimport { getMark, getNode, getStoreConfig } from './util';\n\nimport { TypeEventState, TypeTreeNodeModel } from './interface';\n\nexport default function useTree(props: TdTreeProps) {\n const treeStore = ref();\n const cacheMap = new Map();\n const treeNodeViews = ref([]);\n const { expanded, actived, value, modelValue } = toRefs(props);\n\n const [innerChecked, setInnerChecked] = useVModel(value, modelValue, props.defaultValue, props.onChange);\n const [innerActived, setInnerActived] = useDefaultValue(actived, props.defaultActived, props.onActive, 'actived');\n const [innerExpanded, setInnerExpanded] = useDefaultValue(\n expanded,\n props.defaultExpanded,\n props.onExpand,\n 'expanded',\n );\n\n // 懒加载回调\n const handleLoad = (info: TypeEventState) => {\n const { node } = info;\n const ctx = {\n node: node.getModel(),\n };\n if (innerChecked.value && innerChecked.value.length > 0) {\n treeStore.value.replaceChecked(innerChecked.value);\n }\n if (innerExpanded.value && innerExpanded.value.length > 0) {\n treeStore.value.replaceExpanded(innerExpanded.value);\n }\n if (innerActived.value && innerActived.value.length > 0) {\n treeStore.value.replaceActived(innerActived.value);\n }\n props.onLoad?.(ctx);\n };\n\n // 点击回调\n const handleClick = (state: TypeEventState) => {\n const { expandOnClickNode } = props;\n const { mouseEvent, event, node } = state;\n\n if (!node) {\n return;\n }\n let shouldExpand = expandOnClickNode;\n let shouldActive = !props.disabled && !node.disabled;\n ['trigger', 'ignore'].forEach((markName) => {\n const mark = getMark(markName, event.target as HTMLElement, event.currentTarget as HTMLElement);\n const markValue = mark?.value || '';\n if (markValue.indexOf('expand') >= 0) {\n if (markName === 'trigger') {\n shouldExpand = true;\n } else if (markName === 'ignore') {\n // shouldExpand = false;\n }\n }\n if (markValue.indexOf('active') >= 0) {\n if (markName === 'ignore') {\n shouldActive = false;\n }\n }\n });\n\n const ctx = {\n node: node.getModel(),\n e: mouseEvent,\n };\n\n if (shouldExpand) {\n const tnode = getNode(treeStore.value, node);\n const expanded = node.setExpanded(!tnode.isExpanded());\n setInnerExpanded(expanded, { ...ctx, trigger: 'node-click' });\n }\n\n if (shouldActive) {\n const tnode = getNode(treeStore.value, node);\n const actived = node.setActived(!tnode.isActived());\n setInnerActived(actived, ctx);\n }\n\n props.onClick?.(ctx);\n };\n\n const handleChange = (state: TypeEventState) => {\n const { disabled } = props;\n const { node, mouseEvent } = state;\n if (!node || disabled || node.disabled) {\n return;\n }\n\n const tnode = getNode(treeStore.value, node);\n const checked = node.setChecked(!tnode.isChecked());\n setInnerChecked(checked, {\n node: node.getModel(),\n e: mouseEvent,\n });\n };\n\n // 节点渲染\n const renderTreeNodeViews = () => {\n const nodes = treeStore.value.getNodes();\n\n treeNodeViews.value = nodes\n .filter((node: TreeNode) => node.visible)\n .map((node: TreeNode) => {\n // 如果节点已经存在,则使用缓存节点\n let nodeView = cacheMap.get(node.value);\n // 如果节点未曾创建,则临时创建\n if (!nodeView) {\n // 初次仅渲染可显示的节点\n // 不存在节点视图,则创建该节点视图并插入到当前位置\n nodeView = (\n <TreeItem\n key={node.value}\n node={node}\n onChange={handleChange}\n onClick={handleClick}\n expandOnClickNode={props.expandOnClickNode}\n />\n );\n cacheMap.set(node.value, nodeView);\n }\n return nodeView;\n });\n\n // 更新缓存后,被删除的节点要移除掉,避免内存泄露\n nextTick(() => {\n cacheMap.forEach((view, value: string) => {\n if (!treeStore.value.getNode(value)) {\n cacheMap.delete(value);\n }\n });\n });\n };\n\n useOnDrag(treeStore);\n\n // 更新展开状态\n const updateExpanded = () => {\n const { expandParent } = props;\n // 初始化展开状态\n // 校验是否自动展开父节点\n if (isArray(innerExpanded.value)) {\n const expandedMap = new Map();\n innerExpanded.value.forEach((val) => {\n expandedMap.set(val, true);\n if (expandParent) {\n const node = treeStore.value.getNode(val);\n node.getParents().forEach((tn: TypeTreeNodeModel) => {\n expandedMap.set(tn.value, true);\n });\n }\n });\n const expandedArr = Array.from(expandedMap.keys());\n treeStore.value.setExpanded(expandedArr);\n }\n };\n\n // 初始化\n const init = () => {\n let options = props.data;\n const store = new TreeStore({\n ...getStoreConfig(props),\n onLoad: (info: TypeEventState) => {\n handleLoad(info);\n },\n onUpdate: () => {\n renderTreeNodeViews();\n },\n });\n\n // 初始化数据\n treeStore.value = store;\n\n if (!isArray(options)) {\n options = [];\n }\n store.append(options);\n\n // 刷新节点,必须在配置选中之前执行\n // 这样选中态联动判断才能找到父节点\n store.refreshNodes();\n\n // 初始化选中状态\n if (isArray(innerChecked.value)) {\n store.setChecked(innerChecked.value);\n }\n\n updateExpanded();\n\n // 初始化激活状态\n if (isArray(innerActived.value)) {\n store.setActived(innerActived.value);\n }\n\n // 树的数据初始化之后,需要立即进行一次视图刷新\n renderTreeNodeViews();\n };\n\n // ------ 监听start ------\n\n // data变化,重构 tree\n watch(\n () => props.data,\n (list) => {\n list = props.data;\n cacheMap.clear();\n\n treeStore.value.reload(list);\n // 刷新节点,必须在配置选中之前执行\n // 这样选中态联动判断才能找到父节点\n treeStore.value.refreshNodes();\n if (!list.length) return;\n // 初始化选中状态\n if (isArray(innerChecked.value)) {\n treeStore.value.setChecked(innerChecked.value);\n }\n\n // 更新展开状态\n updateExpanded();\n\n // 初始化激活状态\n if (isArray(innerActived.value)) {\n treeStore.value.setActived(innerActived.value);\n }\n // 刷新节点状态\n treeStore.value.refreshState();\n },\n { deep: true },\n );\n\n // tree插件配置变化\n watch(\n () => getStoreConfig(props),\n () => {\n if (!treeStore.value) return;\n treeStore.value.setConfig(getStoreConfig(props));\n },\n );\n watch(\n innerChecked,\n (nVal) => {\n treeStore.value.replaceChecked(nVal);\n },\n { deep: true },\n );\n watch(\n innerExpanded,\n (nVal) => {\n treeStore.value.replaceExpanded(nVal);\n },\n { deep: true },\n );\n watch(\n innerActived,\n (nVal) => {\n treeStore.value.replaceActived(nVal);\n },\n { deep: true },\n );\n\n // 初始化树\n init();\n\n return {\n treeStore,\n treeNodeViews,\n };\n}\n"],"names":["innerChecked","setInnerChecked","innerActived","setInnerActived","innerExpanded","setInnerExpanded","node","shouldExpand","shouldActive","e","trigger","nextTick","cacheMap","isArray","expandedMap","treeStore","onLoad","renderTreeNodeViews","options","store","updateExpanded","watch","deep","init","treeNodeViews"],"mappings":"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"}