首页
技术小册
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.3 带推荐列表的输入框组件 在现代Web开发中,提升用户体验的一个关键手段是通过智能的UI组件来简化用户操作。带推荐列表的输入框组件(Autocomplete Input Component)便是这样一个强大的工具,它能够在用户输入时动态显示一系列相关建议,帮助用户快速选择或完成输入。在TypeScript和Vue的联合应用下,我们可以构建出既类型安全又响应迅速的推荐列表输入框组件。本章节将详细介绍如何设计和实现这样一个组件。 #### 13.2.3.1 需求分析 在设计带推荐列表的输入框组件之前,首先需要明确组件的功能需求: 1. **基础输入功能**:用户可以在输入框中输入文本。 2. **动态推荐列表**:根据用户输入实时显示推荐列表,列表内容应与输入内容相关。 3. **选择功能**:用户可以从推荐列表中选择一个选项,该选项将自动填充到输入框中。 4. **键盘导航**:支持使用键盘(如上下箭头键)在推荐列表中导航,并通过Enter键选择。 5. **自定义样式**:允许开发者根据需求自定义组件的样式。 6. **性能优化**:确保组件在大数据集下依然保持流畅的响应速度。 #### 13.2.3.2 组件结构设计 基于上述需求,我们可以将组件拆分为几个主要部分: - **InputElement**:负责接收用户输入的文本框。 - **DropdownList**:显示推荐列表的容器,根据用户输入动态更新内容。 - **ListItem**:推荐列表中的每一项,可点击或键盘选择。 - **Controller**:逻辑控制单元,处理输入事件、搜索逻辑、列表更新等。 #### 13.2.3.3 TypeScript 类型定义 在Vue组件中使用TypeScript,首先需要定义组件的props、data、methods等属性的类型。以下是一个基本的类型定义示例: ```typescript // AutocompleteInput.vue <script lang="ts"> import Vue from 'vue'; export default Vue.extend({ name: 'AutocompleteInput', props: { source: { type: Array as () => Array<string | object>, required: true }, value: { type: [String, Object], default: '' }, // 假设source为对象数组时,key属性指定用于搜索和显示的字段 key: { type: String, default: 'name' } }, data() { return { query: '', filteredList: [] as Array<string | object> }; }, // ... 省略methods、computed等 }); </script> ``` #### 13.2.3.4 组件实现 ##### 模板部分 Vue的模板部分将定义组件的HTML结构。这里我们使用`v-model`来双向绑定输入框的值,并使用`v-for`来渲染推荐列表: ```html <template> <div class="autocomplete-input"> <input type="text" v-model="query" @input="filterList" @keydown.enter="selectItem" @keydown.up.prevent="moveUp" @keydown.down.prevent="moveDown" class="autocomplete-input-field" /> <div v-if="filteredList.length > 0" class="autocomplete-dropdown"> <ul> <li v-for="(item, index) in filteredList" :key="index" @click="selectItem(item)" :class="{ 'active': activeIndex === index }" > {{ item[key] || item }} </li> </ul> </div> </div> </template> ``` ##### 逻辑部分 在Vue组件的`<script>`部分,我们将实现过滤逻辑、选择逻辑以及键盘导航逻辑: ```typescript // ... 省略props和data定义 methods: { filterList() { // 假设source是对象数组,且每个对象都有key属性 this.filteredList = this.source.filter(item => { if (typeof item === 'string') { return item.toLowerCase().includes(this.query.toLowerCase()); } else { return (item[this.key] as string).toLowerCase().includes(this.query.toLowerCase()); } }); }, selectItem(item: string | object) { // 处理选择逻辑,例如更新v-model绑定的值 this.$emit('input', typeof item === 'string' ? item : item[this.key]); this.query = typeof item === 'string' ? item : (item[this.key] as string); this.filteredList = []; // 清除推荐列表 }, moveUp() { // 向上导航逻辑 if (this.activeIndex > 0) { this.activeIndex--; } }, moveDown() { // 向下导航逻辑 if (this.activeIndex < this.filteredList.length - 1) { this.activeIndex++; } }, // ... 省略其他逻辑 }, computed: { // 可以添加一个计算属性来管理activeIndex }, watch: { // 监听query变化,可能还需要重置activeIndex等 } ``` ##### 样式部分 CSS样式将决定组件的外观。这里简单展示一些基本样式: ```css <style scoped> .autocomplete-input { position: relative; } .autocomplete-input-field { width: 100%; padding: 8px; box-sizing: border-box; } .autocomplete-dropdown { position: absolute; width: 100%; background-color: #f9f9f9; border: 1px solid #ddd; z-index: 1; } .autocomplete-dropdown ul { list-style: none; padding: 0; margin: 0; } .autocomplete-dropdown li { padding: 8px; cursor: pointer; } .autocomplete-dropdown li.active { background-color: #ddd; } </style> ``` #### 13.2.3.5 组件使用与扩展 完成上述步骤后,你的带推荐列表的输入框组件就基本完成了。你可以在任何Vue项目中通过引入该组件并使用它来增强用户体验。此外,根据具体需求,你还可以进一步扩展该组件的功能,比如添加异步搜索支持、自定义渲染函数、支持分组列表等。 ### 总结 通过本章节的学习,你应该已经掌握了如何在TypeScript和Vue的框架下设计和实现一个带推荐列表的输入框组件。这个组件不仅提升了用户输入的效率和准确性,还展示了Vue组件化开发的强大能力。在实际项目中,你可以根据具体需求对组件进行定制和扩展,以满足更加复杂和多样化的使用场景。
上一篇:
13.2.2 标准输入框组件
下一篇:
13.2.4 数字输入框
该分类下的相关小册推荐:
TypeScript和Vue从入门到精通(一)
Vue.js从入门到精通(三)
Vue.js从入门到精通(一)
Vue源码完全解析
vuejs组件实例与底层原理精讲
TypeScript和Vue从入门到精通(五)
Vue3技术解密
vue项目构建基础入门与实战
Vue.js从入门到精通(二)
TypeScript和Vue从入门到精通(二)
VUE组件基础与实战
移动端开发指南