架构设计思路
- 顶层组件设计:创建一个顶层的树形菜单组件,该组件作为整个树形结构的容器,负责管理整体状态以及提供数据入口。
- 节点组件设计:设计一个节点组件,用于表示树形结构中的每个节点。节点组件可以包含子节点,形成递归结构。
- 可配置性设计:为每个节点组件提供可配置的属性,如样式、行为等,以实现高度的自定义。
组件间数据传递方式
- 父到子传递:顶层组件通过属性将数据传递给节点组件,例如节点的文本、是否展开等状态。
- 子到父传递:节点组件通过事件向顶层组件传递信息,比如节点的点击事件等。
利用Slot实现高度可配置性
- 默认内容插槽:在节点组件中使用默认插槽,允许用户在节点内部插入自定义内容,如自定义的图标、文本等。
- 具名插槽:对于特定位置,如节点展开后的内容区域,可以使用具名插槽,方便用户定制特定部分的内容。
核心代码示例
- 顶层树形菜单组件 (Tree.svelte)
<script>
let treeData = [
{ id: 1, label: 'Node 1', children: [
{ id: 11, label: 'Node 1.1' }
]}
];
</script>
{#each treeData as node}
<TreeNode {node}>
<span slot="custom-icon">📄</span>
</TreeNode>
{/each}
- 节点组件 (TreeNode.svelte)
<script>
export let node;
let isExpanded = false;
const handleClick = () => {
isExpanded =!isExpanded;
};
</script>
<button on:click={handleClick}>
{#if $slots.custom-icon}
<slot name="custom-icon"></slot>
{/if}
{node.label}
</button>
{#if isExpanded && node.children}
<div>
{#each node.children as childNode}
<TreeNode {childNode}>
<span slot="custom-icon">📃</span>
</TreeNode>
{/each}
</div>
{/if}