Files
element-plus/packages/components/tree-v2/src/tree.vue
MoConWu b2a17f0689 feat(components): [tree-v2] support node-drop event (#16935)
* Update tree.vue

* Update tree-node.vue

* Update tree.vue

* Update virtual-tree.ts

* Update useTree.ts

* Update virtual-tree.ts

* Update tree.test.ts

* Update useTree.ts

* Update tree-node.vue

* Update tree.vue

* Update virtual-tree.ts

* Update tree-v2.md

* Update tree-v2.md

* Update virtual-tree.ts

* Update tree-node.vue

* Update useTree.ts

* Update tree.vue

* Update virtual-tree.ts

* Update tree.test.ts

* 修改错误的提交 tree-v2.md

* Update useTree wrong.ts

* Update tree-node.vue

拖拽事件更新

* Update tree-v2.md, add version info

* Update tree-v2.md format

* Update tree-v2.md, version change to 2.8.3
2024-09-11 15:33:26 +08:00

131 lines
2.9 KiB
Vue

<template>
<div
:class="[ns.b(), { [ns.m('highlight-current')]: highlightCurrent }]"
role="tree"
>
<fixed-size-list
v-if="isNotEmpty"
ref="listRef"
:class-name="ns.b('virtual-list')"
:data="flattenTree"
:total="flattenTree.length"
:height="height"
:item-size="treeNodeSize"
:perf-mode="perfMode"
>
<template #default="{ data, index, style }">
<el-tree-node
:key="data[index].key"
:style="style"
:node="data[index]"
:expanded="isExpanded(data[index])"
:show-checkbox="showCheckbox"
:checked="isChecked(data[index])"
:indeterminate="isIndeterminate(data[index])"
:item-size="treeNodeSize"
:disabled="isDisabled(data[index])"
:current="isCurrent(data[index])"
:hidden-expand-icon="isForceHiddenExpandIcon(data[index])"
@click="handleNodeClick"
@toggle="toggleExpand"
@check="handleNodeCheck"
@drop="handleNodeDrop"
/>
</template>
</fixed-size-list>
<div v-else :class="ns.e('empty-block')">
<span :class="ns.e('empty-text')">{{
emptyText ?? t('el.tree.emptyText')
}}</span>
</div>
</div>
</template>
<script lang="ts" setup>
import { computed, getCurrentInstance, provide, useSlots } from 'vue'
import { useLocale, useNamespace } from '@element-plus/hooks'
import { formItemContextKey } from '@element-plus/components/form'
import { FixedSizeList } from '@element-plus/components/virtual-list'
import { useTree } from './composables/useTree'
import ElTreeNode from './tree-node.vue'
import { ROOT_TREE_INJECTION_KEY, treeEmits, treeProps } from './virtual-tree'
defineOptions({
name: 'ElTreeV2',
})
const props = defineProps(treeProps)
const emit = defineEmits(treeEmits)
const slots = useSlots()
const treeNodeSize = computed(() => props.itemSize)
provide(ROOT_TREE_INJECTION_KEY, {
ctx: {
emit,
slots,
},
props,
instance: getCurrentInstance()!,
})
provide(formItemContextKey, undefined)
const { t } = useLocale()
const ns = useNamespace('tree')
const {
flattenTree,
isNotEmpty,
listRef,
toggleExpand,
isExpanded,
isIndeterminate,
isChecked,
isDisabled,
isCurrent,
isForceHiddenExpandIcon,
handleNodeClick,
handleNodeDrop,
handleNodeCheck,
// expose
toggleCheckbox,
getCurrentNode,
getCurrentKey,
setCurrentKey,
getCheckedKeys,
getCheckedNodes,
getHalfCheckedKeys,
getHalfCheckedNodes,
setChecked,
setCheckedKeys,
filter,
setData,
getNode,
expandNode,
collapseNode,
setExpandedKeys,
scrollToNode,
scrollTo,
} = useTree(props, emit)
defineExpose({
toggleCheckbox,
getCurrentNode,
getCurrentKey,
setCurrentKey,
getCheckedKeys,
getCheckedNodes,
getHalfCheckedKeys,
getHalfCheckedNodes,
setChecked,
setCheckedKeys,
filter,
setData,
getNode,
expandNode,
collapseNode,
setExpandedKeys,
scrollToNode,
scrollTo,
})
</script>