UNPKG

mealcomes

Version:

MealComes 用于学习前端的组件库

1 lines 28.2 kB
{"version":3,"file":"tree-Cx-Er-bV.mjs","sources":["../../../../packages/components/tree/src/tree.ts","../../../../packages/components/tree/src/tree-node-content.tsx","../../../../packages/components/tree/src/treeNode.vue","../../../../packages/components/tree/src/tree.vue","../../../../packages/components/tree/index.ts"],"sourcesContent":["import type { ExtractPropTypes, InjectionKey, PropType, SetupContext } from 'vue';\n\nexport type Key = string | number;\n\nexport interface TreeNode extends Required<TreeOption> {\n level: number;\n rawNode: TreeOption;\n children: TreeNode[];\n isLeaf: boolean; // 是否为叶子节点\n parentKey: Key | undefined;\n}\n\n/**\n * 用户传入的 data 类型\n */\nexport interface TreeOption {\n label?: Key;\n key?: Key;\n children?: TreeOption[];\n isLeaf?: boolean;\n disabled?: boolean;\n [key: string]: unknown; // 除了上面的属性,也可以传其他的\n}\n\n/**\n * tree 组件 props\n */\nexport const treeProps = {\n /**\n * 传入的数据\n */\n data: {\n type: Array as PropType<TreeOption[]>,\n default: () => []\n },\n /**\n * 默认展开的 keys\n */\n defaultExpandedKeys: {\n // 默认展开的 key\n type: Array as PropType<Key[]>,\n default: () => []\n },\n /**\n * label 字段名\n */\n labelField: {\n // data 属性中 label 字段名\n type: String,\n default: 'label'\n },\n /**\n * key 字段名\n */\n keyField: {\n // data 属性中 key 字段名\n type: String,\n default: 'key'\n },\n /**\n * 子树\n */\n childrenField: {\n // // data 属性中 children 字段名\n type: String,\n default: 'children'\n },\n /**\n * 懒加载处理函数\n */\n onLoad: Function as PropType<(node: TreeOption) => Promise<TreeOption[]>>,\n /**\n * 被选中的 key\n */\n selectedKeys: {\n type: Array as PropType<Key[]>\n },\n /**\n * 是否可选\n */\n selectable: {\n type: Boolean,\n default: false\n },\n /**\n * 是否可多选\n */\n multiple: {\n type: Boolean,\n default: false\n },\n /**\n * 默认选中的选项\n */\n defaultCheckedKeys: {\n type: Array as PropType<Key[]>,\n default: () => []\n },\n /**\n * 是否展示 checkbox\n */\n showCheckbox: {\n type: Boolean,\n default: false\n }\n} as const;\n\n/**\n * tree 组件 emit\n */\nexport const treeEmits = {\n /**\n * 选择了的 key 更新\n */\n 'update:selectedKeys': (keys: Key[]) => keys\n};\n\n/**\n * tree 组件 props 的类型\n */\nexport type TreeProps = Partial<ExtractPropTypes<typeof treeProps>>;\n\n/**\n * treeNode 组件 props\n */\nexport const treeNodeProps = {\n /**\n * 节点\n */\n node: {\n type: Object as PropType<TreeNode>,\n required: true\n },\n /**\n * 是否展开\n */\n expanded: {\n type: Boolean,\n required: true\n },\n /**\n * 处于加载中的 keys\n */\n loadingKeys: {\n type: Object as PropType<Set<Key>>,\n required: true\n },\n /**\n * 被选中的 keys\n */\n selectedKeys: {\n type: Array as PropType<Key[]>,\n default: () => []\n },\n /**\n * 是否展示 checkbox\n */\n showCheckbox: {\n type: Boolean,\n default: false\n },\n /**\n * 是否选中\n */\n checked: Boolean,\n /**\n * 是否禁用\n */\n disabled: Boolean,\n /**\n * 是否半选\n */\n indeterminate: Boolean\n} as const;\n\n/**\n * treeNode 组件 emit\n */\nexport const treeNodeEmits = {\n /**\n * 展开/折叠\n */\n toggle: (node: TreeNode) => node,\n /**\n * 节点选择\n */\n select: (node: TreeNode, canMulti: boolean = false) => node || canMulti,\n check: (node: TreeNode, val: boolean) => typeof val === 'boolean' && node \n};\n\n/**\n * treeNode 组件 props 的类型\n */\nexport type TreeNodeProps = Partial<ExtractPropTypes<typeof treeNodeProps>>;\n\n/**\n * tree 组件上下文\n */\nexport interface TreeContext {\n slots: SetupContext['slots'];\n // emit: SetupContext<typeof treeEmits>['emit'];\n}\n\n/**\n * provide/inject key\n */\nexport const treeInjectKey: InjectionKey<TreeContext> = Symbol();\n\n/**\n * treeNodeContent 组件 props\n */\nexport const treeNodeContentProps = {\n node: {\n type: Object as PropType<TreeNode>,\n required: true\n }\n} as const;\n","import { defineComponent, inject, toRef } from 'vue';\nimport { treeInjectKey, treeNodeContentProps } from './tree';\n\nexport default defineComponent({\n name: 'MCTreeNodeContent',\n props: treeNodeContentProps,\n setup(props) {\n const treeContext = inject(treeInjectKey);\n const node = toRef(props, 'node');\n\n return () => {\n return treeContext?.slots.default\n ? treeContext.slots.default({ node: node.value })\n : node.value?.label;\n };\n }\n});\n","<template>\n <div :class=\"[bem.b(), bem.is('selected', selected), bem.is('disabled', node.disabled)]\">\n <span :class=\"bem.b('indent')\" :style=\"{ width: `${node.level * 24}px` }\"></span>\n <span :class=\"[bem.e('expand-icon'), { expanded: expanded && !node.isLeaf }, bem.is('leaf', node.isLeaf)]\"\n @click=\"handleExpand\">\n <MCIcon :class=\"bem.e('switcher')\" size=\"16\" color=\"#1F1F1F\">\n <Switcher v-if=\"!loading\" />\n <Loading v-else />\n </MCIcon>\n </span>\n <mc-checkbox style=\"margin: 0 3px;\" v-if=\"showCheckbox\" :model-value=\"checked\" :disabled=\"disabled\"\n :indeterminate=\"indeterminate\" @change=\"handleCheckChange\"></mc-checkbox>\n <span :class=\"bem.e('content')\" @click=\"handleSelected\">\n <MCTreeNodeContent :node=\"node\"></MCTreeNodeContent>\n </span>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { createNamespace } from '@mealcomes/utils';\nimport { treeNodeEmits, treeNodeProps } from './tree';\nimport MCIcon from '@mealcomes/components/icon'\nimport Switcher from '@mealcomes/components/internal-icon/switcher'\nimport Loading from '@mealcomes/components/internal-icon/loading'\nimport MCTreeNodeContent from './tree-node-content'\nimport McCheckbox from '@mealcomes/components/checkbox'\nimport { computed } from 'vue';\n\nconst bem = createNamespace('tree-node')\n\nconst props = defineProps(treeNodeProps);\nconst emit = defineEmits(treeNodeEmits);\n\nfunction handleExpand() {\n emit('toggle', props.node);\n}\n\nconst loading = computed(() => props.loadingKeys.has(props.node.key));\n\nconst selected = computed(() => props.selectedKeys.includes(props.node.key));\n\nfunction handleSelected(e: MouseEvent) {\n if (props.node.disabled || props.showCheckbox) return;\n emit('select', props.node, e.ctrlKey);\n}\n\nfunction handleCheckChange(val: boolean) {\n emit('check', props.node, val);\n}\n</script>","<template>\n <div :class=\"bem.b()\">\n <!-- 展示8条, 每一条高度为35px -->\n <MCVirtualList :items=\"flattenTree\" :remain=\"8\" :size=\"27\">\n <template #default=\"{ node }\">\n <MCTreeNode :key=\"node.key\" :node=\"node\" :expanded=\"isExpanded(node)\" @toggle=\"toggleExpand\"\n :loadingKeys=\"loadingKeysRef\" :selectedKeys=\"selectKeysRef\" @select=\"handleSelect\"\n :show-checkbox=\"showCheckbox\" :checked=\"isChecked(node)\" :disabled=\"isDisabled(node)\"\n :indeterminate=\"isIndeterminate(node)\" @check=\"toggleCheck\">\n </MCTreeNode>\n </template>\n </MCVirtualList>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, provide, ref, useSlots, watch } from 'vue';\nimport { treeEmits, treeInjectKey, treeProps } from './tree';\nimport type { Key, TreeNode, TreeOption } from './tree';\nimport { createNamespace } from '@mealcomes/utils';\nimport MCTreeNode from './treeNode.vue'\nimport MCVirtualList from '@mealcomes/components/virtual-list'\n\nconst bem = createNamespace('tree');\n\ndefineOptions({\n name: 'mc-tree'\n})\nconst props = defineProps(treeProps);\nconst emit = defineEmits(treeEmits);\n\n// 需要对用户传入的 props 进行格式化\n\n// 将 props.data 格式化后放到 tree 中\nconst tree = ref<TreeNode[]>([])\n\nfunction createOptions(key: string, label: string, children: string) {\n return {\n getKey(node: TreeOption) {\n return node[key] as string; // 用户传递的 key\n },\n getLabel(node: TreeOption) {\n return node[label] as string; // 用户传递的 label\n },\n getChildren(node: TreeOption) {\n return node[children] as TreeOption[]; // 用户传递的 children 获取孩子\n }\n }\n}\n\nconst treeOptions = createOptions(\n props.keyField,\n props.labelField,\n props.childrenField\n);\n\nfunction createTree(data: TreeOption[], parent: TreeNode | null = null): TreeNode[] {\n function traversal(data: TreeOption[], parent: TreeNode | null = null): TreeNode[] {\n return data.map((node: TreeOption) => {\n const children = treeOptions.getChildren(node) || [];\n const treeNode: TreeNode = {\n key: treeOptions.getKey(node),\n label: treeOptions.getLabel(node),\n children: [], // 默认为空\n rawNode: node,\n level: parent ? parent.level + 1 : 0,\n disabled: !!node.disabled,\n // 以 node 属性 isLeaf 为准,其次是判断孩子是否为空\n // ?? 是对 || 的增强, 即只有 node.isLeaf 不存在的时候, 才会走到后面, 而不是为 false 时\n isLeaf: node.isLeaf ?? children.length == 0,\n parentKey: parent?.key\n }\n if (children.length > 0) {\n // 有孩子则递归孩子,将孩子也格式化成 treeNode 类型\n treeNode.children = traversal(children, treeNode);\n }\n return treeNode;\n })\n }\n\n const result: TreeNode[] = traversal(data, parent);\n\n return result;\n}\n\n// 监控数据变化,调用格式化函数\nwatch(\n () => props.data,\n (data: TreeOption[]) => {\n tree.value = createTree(data);\n },\n {\n immediate: true\n });\n\n// 需要将树展开,点击实现展开操作\n// 会有默认展开项\n\n// 需要展开的 key\nconst expandedKeysSet = ref(new Set(props.defaultExpandedKeys));\n\n/**\n * 根据 expandedKeySet 对树进行展开\n * 例如: expandedKeySet 是 40(代表需要将 key 为 40 的子树展开), \n * - 40\n * - 4010\n * - 4020\n * - 4030\n * - 403010\n * - 403020\n * - 50\n * 展开结果如下:\n * [40, 4010, 4020, 4030, 50]\n */\nconst flattenTree = computed(() => {\n let expandedKeys = expandedKeysSet.value; // 所有要展开的 key\n let flattenNodes: TreeNode[] = []; // 拍平后的结果\n const nodes = tree.value || []; // 被格式化后的节点\n\n const stack: TreeNode[] = []; // 用于遍历树的栈\n // 将 nodes 倒序插入到栈中(因为最外层的节点肯定是拍平的)\n for (let i = nodes.length - 1; i >= 0; i--) {\n stack.push(nodes[i]);\n }\n\n // 深度遍历栈, 将所有需要展开的 key 全部展开\n while (stack.length) {\n const node = stack.pop();\n if (!node) continue;\n flattenNodes.push(node);\n\n if (expandedKeys.has(node.key)) {\n const children = node.children;\n if (children) {\n for (let i = children.length - 1; i >= 0; i--) {\n stack.push(children[i]);\n }\n }\n }\n }\n\n return flattenNodes;\n});\n\n/**\n * 从 flattenTree 中找到指定 key 的 node\n */\nfunction findNode(key: Key) {\n return flattenTree.value.find(node => node.key === key)\n}\n\nfunction isExpanded(node: TreeNode): boolean {\n return expandedKeysSet.value.has(node.key);\n}\n\n/** \n * 折叠子树\n */\nfunction collapse(node: TreeNode) {\n expandedKeysSet.value.delete(node.key);\n}\n/**\n * 正处于加载中的 key, 用于防止用户多次点击同一个 key\n */\nconst loadingKeysRef = ref(new Set<Key>());\n\n/**\n * 触发 children 加载\n */\nfunction triggerLoading(node: TreeNode) {\n // 不是叶子节点但孩子长度为 0, 则说明需要异步加载\n if (!node.children.length && !node.isLeaf) {\n const loadingKeys = loadingKeysRef.value;\n if (!loadingKeys.has(node.key)) {\n loadingKeys.add(node.key);\n const onLoad = props.onLoad;\n if (onLoad) {\n onLoad(node.rawNode)\n .then(children => {\n // 修改节点的原始 children(即用户传入的 children)\n node.rawNode.children = children;\n // 对 children 进行规范化\n node.children = createTree(children, node);\n loadingKeys.delete(node.key);\n })\n .catch(() => {\n node.isLeaf = true;\n })\n }\n }\n }\n}\n\n/**\n * 展开子树\n */\nfunction expand(node: TreeNode) {\n\n // 触发懒加载\n triggerLoading(node);\n expandedKeysSet.value.add(node.key);\n}\n\n/**\n * 切换展开状态\n */\nfunction toggleExpand(node: TreeNode) {\n const expandKeys = expandedKeysSet.value;\n if (expandKeys.has(node.key)\n && !loadingKeysRef.value.has(node.key) // 如果当前节点正处于加载中, 则不能收起\n ) {\n collapse(node);\n } else {\n expand(node);\n }\n}\n\nconst selectKeysRef = ref<Key[]>([]);\nwatch(\n () => props.selectedKeys,\n value => {\n if (value) {\n selectKeysRef.value = value;\n }\n },\n {\n immediate: true\n }\n)\n\n/**\n * 处理选中的节点\n */\nfunction handleSelect(node: TreeNode, canMulti: boolean | undefined) {\n let keys = Array.from(selectKeysRef.value);\n\n // 不能选择\n if (!props.selectable) return;\n\n if (props.multiple && canMulti) {\n let index = keys.findIndex(key => key === node.key);\n if (index > -1) {\n // 已选中则删除\n keys.splice(index, 1);\n } else {\n // 未选中则添加\n keys.push(node.key);\n }\n } else {\n if (keys.includes(node.key)) {\n keys = [];\n } else {\n keys = [node.key];\n }\n }\n emit('update:selectedKeys', keys);\n}\n\nprovide(treeInjectKey, {\n slots: useSlots()\n})\n\nconst checkedKeysRef = ref(new Set(props.defaultCheckedKeys));\n\nfunction isChecked(node: TreeNode) {\n return checkedKeysRef.value.has(node.key);\n}\n\nfunction isDisabled(node: TreeNode) {\n return !!node.disabled;\n}\n\nconst indeterminateRefs = ref<Set<Key>>(new Set());\n\nfunction isIndeterminate(node: TreeNode) {\n return indeterminateRefs.value.has(node.key);\n}\n\n/**\n * 自上而下的更新选中\n */\nfunction updateCheckToBottom(node: TreeNode, checked: boolean) {\n if (!node) return;\n const checkedKeys = checkedKeysRef.value;\n\n if (checked) { // 选中的时候去掉半选状态\n indeterminateRefs.value.delete(node.key);\n }\n\n checkedKeys[checked ? 'add' : 'delete'](node.key);\n\n const children = node.children;\n if (children) {\n children.forEach(child => {\n if (!child.disabled) {\n updateCheckToBottom(child, checked)\n }\n })\n }\n}\n\n/**\n * 自下而上的更新选中 \n */\nfunction updateCheckToTop(node: TreeNode) {\n const parent = node.parentKey;\n if (parent) {\n const parenNode = findNode(node.parentKey!);\n if (parenNode) {\n let allChecked = true, hasChecked = false;\n const children = parenNode.children;\n for (let child of children) {\n if (checkedKeysRef.value.has(child.key)) {\n // 儿子有被选中的\n hasChecked = true;\n } else if (indeterminateRefs.value.has(child.key)) {\n // 儿子有半选的\n allChecked = false;\n hasChecked = true;\n } else {\n // 儿子没有被选中的\n allChecked = false;\n }\n }\n if (allChecked) {\n checkedKeysRef.value.add(parenNode.key);\n indeterminateRefs.value.delete(parenNode.key);\n } else if (hasChecked) {\n checkedKeysRef.value.delete(parenNode.key);\n indeterminateRefs.value.add(parenNode.key);\n } else {\n checkedKeysRef.value.delete(parenNode.key);\n indeterminateRefs.value.delete(parenNode.key);\n }\n updateCheckToTop(parenNode);\n }\n }\n}\n\nfunction toggleCheck(node: TreeNode, checked: boolean) {\n updateCheckToBottom(node, checked);\n updateCheckToTop(node);\n}\n\nonMounted(() => {\n checkedKeysRef.value.forEach(key => {\n const node = findNode(key) as TreeNode;\n if (node) {\n toggleCheck(node, true);\n }\n })\n})\n</script>\n","import { withInstall } from '@mealcomes/utils';\nimport _Tree from './src/tree.vue';\n\nexport const McTree = withInstall(_Tree);\n\nexport default McTree;\nexport * from './src/tree';\n\ndeclare module 'vue' {\n export interface GlobalComponents {\n McTree: typeof McTree;\n }\n}\n"],"names":["treeProps","treeEmits","keys","treeNodeProps","treeNodeEmits","node","canMulti","val","treeInjectKey","treeNodeContentProps","MCTreeNodeContent","name","props","setup","treeContext","inject","toRef","slots","default","value","label","bem","createNamespace","__props","emit","__emit","handleExpand","loading","computed","selected","handleSelected","e","handleCheckChange","_createElementBlock","_unref","_createElementVNode","_normalizeClass","_normalizeStyle","expanded","_createVNode","MCIcon","_createBlock","Loading","Switcher","showCheckbox","McCheckbox","checked","disabled","indeterminate","tree","ref","createOptions","key","children","treeOptions","createTree","data","parent","traversal","treeNode","watch","expandedKeysSet","flattenTree","expandedKeys","flattenNodes","nodes","stack","i","findNode","isExpanded","collapse","loadingKeysRef","triggerLoading","loadingKeys","onLoad","expand","toggleExpand","selectKeysRef","handleSelect","index","provide","useSlots","checkedKeysRef","isChecked","isDisabled","indeterminateRefs","isIndeterminate","updateCheckToBottom","checkedKeys","child","updateCheckToTop","parenNode","allChecked","hasChecked","toggleCheck","onMounted","MCVirtualList","_withCtx","MCTreeNode","McTree","withInstall","_Tree"],"mappings":"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"}