当前位置:  首页>> 技术小册>> TypeScript和Vue从入门到精通(三)

10.4 实战:支持搜索和筛选的用户列表示例

在Web开发中,列表展示与数据操作是基础且核心的功能之一。本章节将深入探讨如何结合TypeScript和Vue.js框架,构建一个支持搜索和筛选功能的用户列表示例。我们将从项目初始化、数据模型定义、组件设计、逻辑实现到最终的界面展示,全面覆盖这一功能的开发过程。

10.4.1 项目初始化与依赖安装

首先,确保你已经安装了Node.js和npm/yarn。接下来,我们将使用Vue CLI来快速搭建项目框架。如果尚未安装Vue CLI,可以通过npm全局安装:

  1. npm install -g @vue/cli
  2. # 或者使用yarn
  3. yarn global add @vue/cli

然后,创建一个新的Vue项目,并添加TypeScript支持:

  1. vue create vue-user-list-with-search-and-filter
  2. # 在选择特性时,确保选中了TypeScript和Vuex(如果需要状态管理)

进入项目目录,并安装可能需要的额外依赖,如axios用于HTTP请求(模拟从服务器获取数据):

  1. cd vue-user-list-with-search-and-filter
  2. npm install axios
  3. # 或者使用yarn
  4. yarn add axios

10.4.2 数据模型定义

在TypeScript中,我们首先定义用户的数据模型。在src/types目录下创建一个User.ts文件(如果没有types目录,请自行创建):

  1. // src/types/User.ts
  2. export interface User {
  3. id: number;
  4. name: string;
  5. email: string;
  6. age: number;
  7. // 可以根据需要添加更多字段
  8. }

10.4.3 组件结构设计

对于本示例,我们将主要关注三个组件:

  1. UserList.vue:主列表组件,负责展示用户列表,并包含搜索和筛选功能。
  2. UserItem.vue:单个用户项的组件,用于渲染每个用户的数据。
  3. SearchAndFilter.vue(可选):一个可复用的搜索和筛选表单组件,如果列表功能复杂,可单独封装。

10.4.4 UserList.vue 实现

src/components目录下创建UserList.vue。此组件将包含数据获取逻辑、搜索逻辑、筛选逻辑以及用户列表的渲染。

  1. <template>
  2. <div>
  3. <input type="text" v-model="searchQuery" placeholder="Search users...">
  4. <!-- 假设有年龄筛选,实际项目中可根据需要添加更多筛选条件 -->
  5. <select v-model="ageFilter">
  6. <option value="">All Ages</option>
  7. <option value="18">18+</option>
  8. <option value="25">25+</option>
  9. <!-- 更多选项 -->
  10. </select>
  11. <ul>
  12. <user-item
  13. v-for="user in filteredUsers"
  14. :key="user.id"
  15. :user="user"
  16. />
  17. </ul>
  18. </div>
  19. </template>
  20. <script lang="ts">
  21. import { defineComponent, ref, computed } from 'vue';
  22. import { User } from '@/types/User'; // 引入用户类型定义
  23. import axios from 'axios';
  24. export default defineComponent({
  25. name: 'UserList',
  26. components: {
  27. UserItem: () => import('./UserItem.vue')
  28. },
  29. setup() {
  30. const users = ref<User[]>([]);
  31. const searchQuery = ref('');
  32. const ageFilter = ref('');
  33. // 假设函数fetchUsers从API获取用户数据
  34. const fetchUsers = async () => {
  35. // 模拟API请求
  36. const response = await axios.get('https://jsonplaceholder.typicode.com/users');
  37. users.value = response.data as User[];
  38. };
  39. // 组件挂载时获取数据
  40. fetchUsers();
  41. // 计算属性,用于过滤用户列表
  42. const filteredUsers = computed(() => {
  43. return users.value.filter(user => {
  44. if (searchQuery.value.trim() !== '') {
  45. // 搜索功能,这里简单使用name和email包含搜索词
  46. return user.name.toLowerCase().includes(searchQuery.value.toLowerCase()) ||
  47. user.email.toLowerCase().includes(searchQuery.value.toLowerCase());
  48. }
  49. if (ageFilter.value !== '') {
  50. // 筛选功能
  51. return user.age >= parseInt(ageFilter.value, 10);
  52. }
  53. // 无搜索和筛选时,返回所有用户
  54. return true;
  55. });
  56. });
  57. return { users, searchQuery, ageFilter, filteredUsers };
  58. }
  59. });
  60. </script>

10.4.5 UserItem.vue 实现

接下来,创建UserItem.vue来展示单个用户的信息。

  1. <template>
  2. <li>{{ user.name }} - {{ user.email }} (Age: {{ user.age }})</li>
  3. </template>
  4. <script lang="ts">
  5. import { defineComponent, PropType } from 'vue';
  6. import { User } from '@/types/User';
  7. export default defineComponent({
  8. name: 'UserItem',
  9. props: {
  10. user: {
  11. type: Object as PropType<User>,
  12. required: true
  13. }
  14. }
  15. });
  16. </script>

10.4.6 样式与响应式优化

为了提升用户体验,你可以为UserList.vueUserItem.vue添加CSS样式。此外,考虑到性能和响应式,确保在数据量大时优化列表渲染,比如使用虚拟滚动等技术。

10.4.7 测试与调试

在开发过程中,不断进行测试和调试是非常重要的。你可以使用Vue Devtools这样的浏览器扩展来帮助你检查和调试Vue组件。同时,编写单元测试(如使用Jest和Vue Test Utils)也是保证代码质量的有效手段。

10.4.8 总结

通过本章节的实战示例,我们学习了如何在Vue.js和TypeScript环境下,构建一个支持搜索和筛选功能的用户列表示例。我们涵盖了从项目初始化、数据模型定义、组件设计到逻辑实现的全过程,并简单讨论了样式和响应式优化以及测试与调试的重要性。希望这个示例能帮助你更好地理解和应用Vue.js和TypeScript在Web开发中的强大功能。


该分类下的相关小册推荐: