123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <template>
- <div
- ref="node$"
- :class="[
- ns.b('node'),
- ns.is('expanded', expanded),
- ns.is('current', current),
- ns.is('focusable', !disabled),
- ns.is('checked', !disabled && checked),
- ]"
- role="treeitem"
- tabindex="-1"
- :level="node.level"
- :aria-expanded="expanded"
- :aria-disabled="disabled"
- :aria-checked="checked"
- :data-key="node?.key"
- @click.stop="handleClick"
- @contextmenu="handleContextMenu"
- >
- <template v-for="item in node.level" :key="item">
- <i v-if="item - 2 > 0" :class="`line-i-${item - 2}`" />
- </template>
- <div
- :class="ns.be('node', 'content')"
- :style="{
- paddingLeft: `${(node.level - 1) * indent}px`,
- height: itemSize + 'px',
- }"
- >
- <el-icon
- v-if="icon"
- :class="[
- ns.is('leaf', !!node?.isLeaf),
- ns.is('hidden', hiddenExpandIcon),
- {
- expanded: !node?.isLeaf && expanded,
- },
- ns.be('node', 'expand-icon'),
- ]"
- @click.stop="handleExpandIconClick"
- >
- <component :is="icon" />
- </el-icon>
- <el-checkbox
- v-if="showCheckbox"
- :model-value="checked"
- :indeterminate="indeterminate"
- :disabled="disabled"
- @change="handleCheckChange"
- @click.stop
- />
- <el-node-content :node="node" />
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import { computed, inject } from 'vue'
- import ElIcon from '@element-plus/components/icon'
- import { CaretRight } from '@element-plus/icons-vue'
- import ElCheckbox from '@element-plus/components/checkbox'
- import { useNamespace } from '@element-plus/hooks'
- import ElNodeContent from './tree-node-content'
- import {
- NODE_CONTEXTMENU,
- ROOT_TREE_INJECTION_KEY,
- treeNodeEmits,
- treeNodeProps,
- } from './virtual-tree'
- import type { CheckboxValueType } from '@element-plus/components/checkbox'
- defineOptions({
- name: 'ElTreeNode',
- })
- const props = defineProps(treeNodeProps)
- const emit = defineEmits(treeNodeEmits)
- const tree = inject(ROOT_TREE_INJECTION_KEY)
- const ns = useNamespace('tree')
- const indent = computed(() => {
- return tree?.props.indent ?? 16
- })
- const icon = computed(() => {
- return tree?.props.icon ?? CaretRight
- })
- const handleClick = (e: MouseEvent) => {
- emit('click', props.node, e)
- }
- const handleExpandIconClick = () => {
- emit('toggle', props.node)
- }
- const handleCheckChange = (value: CheckboxValueType) => {
- emit('check', props.node, value)
- }
- const handleContextMenu = (event: Event) => {
- if (tree?.instance?.vnode?.props?.['onNodeContextmenu']) {
- event.stopPropagation()
- event.preventDefault()
- }
- tree?.ctx.emit(NODE_CONTEXTMENU, event, props.node?.data, props.node)
- }
- </script>
|