首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 11 章 使用动画
11.1 使用CSS 3创建动画
11.1.1 transition过渡动画
11.1.2 keyframes动画
11.2 使用JavaScript的方式实现动画效果
11.3 Vue过渡动画
11.3.1 定义过渡动画
11.3.2 设置动画过程中的监听回调
11.3.3 多个组件的过渡动画
11.3.4 列表过渡动画
11.4 实战:优化用户列表页面
第 12 章 Vue CLI工具的使用
12.1 Vue CLI工具入门
12.1.1 Vue CLI工具的安装
12.1.2 快速创建Vue项目
12.2 Vue CLI项目模板工程
12.2.1 模板工程的目录结构
12.2.2 运行Vue项目工程
12.2.3 vue-class-component库简介
12.3 在项目中使用依赖
12.4 工程构建
12.5 新一代前端构建工具Vite
12.5.1 Vite与Vue CLI
12.5.2 体验Vite构建工具
第 13 章 Element Plus基于Vue 3的UI组件库
13.1 Element Plus入门
13.1.1 Element Plus的安装与使用
13.1.2 按钮组件
13.1.3 标签组件
13.1.4 空态图与加载占位图组件
13.1.5 图片与头像组件
13.2 表单类组件
13.2.1 单选框与多选框
13.2.2 标准输入框组件
13.2.3 带推荐列表的输入框组件
13.2.4 数字输入框
13.2.5 选择列表
13.2.6 多级列表组件
13.3 开关与滑块组件
13.3.1 开关组件
13.3.2 滑块组件
13.4 选择器组件
13.4.1 时间选择器
13.4.2 日期选择器
13.4.3 颜色选择器
13.5 提示类组件
13.5.1 警告组件
13.5.2 消息提示
13.5.3 通知组件
13.6 数据承载相关组件
13.6.1 表格组件
13.6.2 导航组件
13.6.3 标签页组件
13.6.4 抽屉组件
13.6.5 布局容器组件
13.7 实战:教务系统学生表
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(四)
小册名称:TypeScript和Vue从入门到精通(四)
### 13.2.6 多级列表组件 在Web开发中,多级列表(通常指嵌套列表)是展示层级关系数据的常用方式,如文件目录结构、组织架构图、菜单导航等。在Vue结合TypeScript的环境下构建多级列表组件,不仅能提升应用的模块化和可维护性,还能通过TypeScript的强类型特性,确保数据处理的准确性和效率。本章节将详细介绍如何在Vue 3和TypeScript项目中实现一个功能丰富、灵活可配置的多级列表组件。 #### 13.2.6.1 需求分析 在设计多级列表组件之前,首先明确其需求: - **支持嵌套**:能够递归地渲染嵌套列表项。 - **灵活配置**:允许通过props传递配置项,如是否显示子列表展开/折叠按钮、列表项样式等。 - **数据驱动**:组件应完全由传入的数据驱动,包括列表项的内容、层级关系等。 - **事件处理**:提供事件机制,如点击项时触发事件,子列表展开/折叠时的回调等。 - **性能优化**:对于大量数据的渲染,应采取适当的优化措施,如虚拟滚动等(虽然本章节不深入讲解虚拟滚动)。 #### 13.2.6.2 组件结构设计 基于上述需求,我们可以将多级列表组件分为几个关键部分来设计: - **ListItem.vue**:列表项组件,负责渲染单个列表项,可能包含文本、图标、子列表展开/折叠按钮等。 - **List.vue**:列表容器组件,负责递归渲染所有列表项,并管理子列表的展开/折叠状态。 #### 13.2.6.3 ListItem.vue 组件实现 `ListItem.vue` 是列表项的基本单位,它接收来自父组件的数据(如项的内容、是否有子项、是否展开等),并渲染相应的界面。 ```vue <template> <div class="list-item" @click="handleClick"> <span>{{ item.text }}</span> <span v-if="item.children && isExpandable" @click.stop="toggle"> {{ isExpanded ? '-' : '+' }} </span> <List v-if="isExpanded && item.children" :list="item.children" :is-expandable="isExpandable" /> </div> </template> <script lang="ts"> import { defineComponent, PropType, ref, watch } from 'vue'; import List from './List.vue'; export default defineComponent({ components: { List }, props: { item: { type: Object as PropType<{ text: string; children?: any[] }>, required: true }, isExpandable: { type: Boolean, default: true } }, setup(props) { const isExpanded = ref(false); function toggle() { isExpanded.value = !isExpanded.value; } function handleClick() { // 可以在这里添加点击项时的逻辑,如发出事件 this.$emit('item-click', props.item); } watch(isExpanded, (newVal) => { // 可选:根据展开状态发出事件 if (newVal) { this.$emit('expand', props.item); } else { this.$emit('collapse', props.item); } }); return { isExpanded, toggle, handleClick }; } }); </script> <style scoped> .list-item { /* 样式定义 */ } </style> ``` 注意:在`setup`函数中,我们使用了`this.$emit`来触发事件,这在Composition API中是不直接支持的。实际中,应使用`defineEmits`来定义并触发事件,但为了简化示例,这里采用了更接近Options API的伪代码形式。 #### 13.2.6.4 List.vue 组件实现 `List.vue` 是列表的容器组件,它接收一个列表数组作为props,并递归地渲染每个列表项。 ```vue <template> <div class="list-container"> <ListItem v-for="item in list" :key="item.id || item.text" :item="item" :is-expandable="isExpandable" @item-click="handleItemClick" @expand="handleExpand" @collapse="handleCollapse" /> </div> </template> <script lang="ts"> import { defineComponent, PropType } from 'vue'; import ListItem from './ListItem.vue'; export default defineComponent({ components: { ListItem }, props: { list: { type: Array as PropType<any[]>, required: true }, isExpandable: { type: Boolean, default: true } }, setup(props, { emit }) { function handleItemClick(item: any) { emit('item-click', item); } function handleExpand(item: any) { emit('expand', item); } function handleCollapse(item: any) { emit('collapse', item); } return { handleItemClick, handleExpand, handleCollapse }; } }); </script> <style scoped> .list-container { /* 样式定义 */ } </style> ``` #### 13.2.6.5 组件使用与扩展 在实际应用中,你可以通过修改`ListItem.vue`和`List.vue`的props和emits来扩展组件的功能,比如添加自定义图标、修改列表项的样式、处理复杂的交互逻辑等。此外,为了优化性能,当列表项数量非常多时,可以考虑引入虚拟滚动或懒加载等技术。 #### 13.2.6.6 总结 通过构建`ListItem.vue`和`List.vue`两个组件,我们实现了一个基本的Vue + TypeScript多级列表组件。这个组件支持嵌套列表的递归渲染,提供了灵活的配置选项和事件处理机制。通过进一步的扩展和优化,它可以适应更复杂的应用场景,为开发者提供强大的列表展示能力。 在实际开发中,根据项目的具体需求,可能还需要对这个基础组件进行更多的定制和优化,比如添加搜索功能、拖拽排序、响应式布局支持等。这些扩展功能可以根据具体需求逐步添加,确保组件的可用性和可维护性。
上一篇:
13.2.5 选择列表
下一篇:
13.3 开关与滑块组件
该分类下的相关小册推荐:
Vue.js从入门到精通(一)
Vue.js从入门到精通(三)
TypeScript和Vue从入门到精通(二)
移动端开发指南
TypeScript和Vue从入门到精通(五)
Vue原理与源码解析
TypeScript和Vue从入门到精通(三)
VUE组件基础与实战
vuejs组件实例与底层原理精讲
Vue3技术解密
vue项目构建基础入门与实战
Vue.js从入门到精通(四)