✨(tree): 新增 title 插槽, 允许自定义节点
This commit is contained in:
@@ -105,18 +105,24 @@ const childrenIndentSize = props.currentIndentSize + props.indentSize;
|
||||
whiteSpace: column.ellipsisTooltip ? 'nowrap' : 'normal',
|
||||
}"
|
||||
>
|
||||
|
||||
|
||||
<!-- 树表占位与缩进 -->
|
||||
<span v-if="expandSpace && index === 0" :style="{'margin-right': currentIndentSize + 'px'}"></span>
|
||||
<span
|
||||
v-if="expandSpace && index === 0"
|
||||
:style="{ 'margin-right': currentIndentSize + 'px' }"
|
||||
></span>
|
||||
|
||||
<span v-if="expandSpace && (!data.children && !slot.expand) && index === 0" class="layui-table-cell-expand-icon-spaced"></span>
|
||||
<span
|
||||
v-if="
|
||||
expandSpace && !data.children && !slot.expand && index === 0
|
||||
"
|
||||
class="layui-table-cell-expand-icon-spaced"
|
||||
></span>
|
||||
|
||||
<lay-icon
|
||||
v-if="(slot.expand || data.children) && index === 0"
|
||||
class="layui-table-cell-expand-icon"
|
||||
:type="expandIconType"
|
||||
@click="handleExpand"
|
||||
v-if="(slot.expand || data.children) && index === 0"
|
||||
class="layui-table-cell-expand-icon"
|
||||
:type="expandIconType"
|
||||
@click="handleExpand"
|
||||
></lay-icon>
|
||||
|
||||
<lay-tooltip
|
||||
@@ -142,11 +148,18 @@ const childrenIndentSize = props.currentIndentSize + props.indentSize;
|
||||
whiteSpace: column.ellipsisTooltip ? 'nowrap' : 'normal',
|
||||
}"
|
||||
>
|
||||
|
||||
<!-- 树表占位与缩进 -->
|
||||
<span v-if="expandSpace && index === 0" :style="{'margin-right': currentIndentSize + 'px'}"></span>
|
||||
<span
|
||||
v-if="expandSpace && index === 0"
|
||||
:style="{ 'margin-right': currentIndentSize + 'px' }"
|
||||
></span>
|
||||
|
||||
<span v-if="expandSpace && (!data.children && !slot.expand) && index === 0" class="layui-table-cell-expand-icon-spaced"></span>
|
||||
<span
|
||||
v-if="
|
||||
expandSpace && !data.children && !slot.expand && index === 0
|
||||
"
|
||||
class="layui-table-cell-expand-icon-spaced"
|
||||
></span>
|
||||
|
||||
<lay-icon
|
||||
v-if="(slot.expand || data.children) && index === 0"
|
||||
@@ -201,4 +214,4 @@ const childrenIndentSize = props.currentIndentSize + props.indentSize;
|
||||
</table-row>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
@@ -5,13 +5,13 @@ export default {
|
||||
</script>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { StringOrNumber, CustomKey, CustomString } from "./tree.type";
|
||||
import { LayIcon } from "@layui/icons-vue";
|
||||
import LayCheckbox from "../checkbox/index.vue";
|
||||
import { Ref, useSlots } from "vue";
|
||||
import { Tree } from "./tree";
|
||||
import { Nullable } from "../../types";
|
||||
import LayTransition from "../transition/index.vue";
|
||||
import { StringOrNumber, CustomKey, CustomString } from "./tree.type";
|
||||
|
||||
export interface TreeData {
|
||||
id: CustomKey;
|
||||
@@ -131,7 +131,12 @@ function handleTitleClick(node: TreeData) {
|
||||
}"
|
||||
@click="handleTitleClick(node)"
|
||||
>
|
||||
{{ node.title }}
|
||||
<template v-if="slots.title">
|
||||
<slot name="title" :data="node"></slot>
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ node.title }}
|
||||
</template>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -149,7 +154,11 @@ function handleTitleClick(node: TreeData) {
|
||||
:tree="tree"
|
||||
:only-icon-control="onlyIconControl"
|
||||
@node-click="recursiveNodeClick"
|
||||
/>
|
||||
>
|
||||
<template v-if="slots.title" v-slot:title="{ data }">
|
||||
<slot name="title" :data="data"></slot>
|
||||
</template>
|
||||
</tree-node>
|
||||
</div>
|
||||
</lay-transition>
|
||||
</div>
|
||||
|
||||
@@ -3,19 +3,16 @@ export default {
|
||||
name: "LayTree",
|
||||
};
|
||||
</script>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import TreeNode from "./TreeNode.vue";
|
||||
import { computed } from "vue";
|
||||
import { computed, useSlots } from "vue";
|
||||
import { useTree } from "./useTree";
|
||||
import { TreeData } from "./tree";
|
||||
import { StringFn, StringOrNumber, KeysType, EditType } from "./tree.type";
|
||||
import "./index.less";
|
||||
|
||||
type StringFn = () => string;
|
||||
type StringOrNumber = string | number;
|
||||
type KeysType = (number | string)[];
|
||||
type EditType = boolean | ("add" | "update" | "delete");
|
||||
|
||||
interface OriginalTreeData {
|
||||
export interface OriginalTreeData {
|
||||
title: StringFn | string;
|
||||
id: StringOrNumber;
|
||||
field: StringFn | string;
|
||||
@@ -23,7 +20,7 @@ interface OriginalTreeData {
|
||||
disabled?: boolean;
|
||||
}
|
||||
|
||||
interface TreeProps {
|
||||
export interface TreeProps {
|
||||
checkedKeys?: KeysType;
|
||||
data: OriginalTreeData;
|
||||
showCheckbox?: boolean;
|
||||
@@ -61,6 +58,8 @@ const props = withDefaults(defineProps<TreeProps>(), {
|
||||
},
|
||||
});
|
||||
|
||||
const slots = useSlots();
|
||||
|
||||
const emit = defineEmits<TreeEmits>();
|
||||
|
||||
const className = computed(() => {
|
||||
@@ -88,6 +87,10 @@ function handleClick(node: TreeData) {
|
||||
:collapse-transition="collapseTransition"
|
||||
:only-icon-control="onlyIconControl"
|
||||
@node-click="handleClick"
|
||||
/>
|
||||
>
|
||||
<template v-if="slots.title" v-slot:title="{ data }">
|
||||
<slot name="title" :data="data"></slot>
|
||||
</template>
|
||||
</tree-node>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
Reference in New Issue
Block a user