vue3 实现多条件搜索

简介: vue3 实现多条件搜索



前言

在现代的前端开发中,Vue.js 是一个非常流行的 JavaScript 框架,用于构建用户界面。Vue 提供了一种简洁的方式来构建交互式和动态的网页应用。在这个例子中,我们将探讨如何使用 Vue 3 和 Composition API 来创建一个简单的搜索功能,允许用户根据不同的条件过滤和显示数据。

用法

在这个例子中,我们有一个包含多个订单信息的数组 `data`。每个订单都有一个 ID、昵称、手机号、标题等属性。我们提供了四个输入框,允许用户输入 ID、昵称、手机号和标题的搜索条件。根据用户的输入,订单列表将实时更新以显示匹配的结果。

1. 数据绑定和事件处理

使用 `v-model` 指令,我们可以创建双向数据绑定,将输入框的值绑定到 Vue 实例的数据属性上。当输入框的值发生变化时,绑定的数据属性也会相应地更新。

<input id="searchId" v-model="searchId" placeholder="ID" />
<input id="searchNickname" v-model="searchNickname" placeholder="Nickname" />
<input id="searchTel" v-model="searchTel" placeholder="Tel" />
<input id="searchTitle" v-model="searchTitle" placeholder="Title" />

在这里,`searchId`、`searchNickname`、`searchTel` 和 `searchTitle` 都是响应式的数据属性,它们的初始值都设置为空字符串。

2. 列表渲染和条件过滤

使用 `v-for` 指令,我们可以遍历 `data` 数组,并为数组中的每个元素渲染一个列表项。

<ul>
  <li v-for="item in filteredData" :key="item.id">
    ID: {{ item.id }}, 名称: {{ item.nickname }}, 手机号: {{ item.tel }}, Title: {{ item.title }}
  </li>
</ul>

在这里,`filteredData` 是一个计算属性,它基于 `data` 和搜索条件来返回过滤后的订单列表。使用 `Array.prototype.filter` 方法,我们可以根据用户输入的搜索条件来过滤订单列表。

const filteredData = computed(() => {
  return data.value.filter(item => {
    return (
      (!searchId.value || item.id.toString().includes(searchId.value)) &&
      (!searchNickname.value || item.nickname.toLowerCase().includes(searchNickname.value.toLowerCase())) &&
      (!searchTel.value || item.tel.includes(searchTel.value)) &&
      (!searchTitle.value || item.title.toLowerCase().includes(searchTitle.value.toLowerCase()))
    );
  });
});

在这个计算属性中,我们检查每个订单的 ID、昵称、手机号和标题是否包含用户输入的搜索条件。如果用户没有输入搜索条件,或者订单的相应属性包含搜索条件,则该订单会被包含在过滤后的结果中。

解析

这个例子展示了 Vue 3 和 Composition API 的强大功能,提供了一种简洁和声明式的方式来构建动态和响应式的用户界面。

1. **响应式数据**: 使用 `ref` 函数,我们可以创建响应式的数据属性。当这些属性的值发生变化时,Vue 会自动更新 DOM,确保用户界面与数据保持同步。

2. **计算属性**: 使用 `computed` 函数,我们可以创建依赖于响应式数据的计算属性。计算属性的值会根据其依赖的数据自动更新,并且它们是惰性求值的,只有在需要时才会重新计算。

3. **双向数据绑定**: 使用 `v-model` 指令,我们可以实现输入框和 Vue 实例数据之间的双向数据绑定。这使得实现表单和用户输入的处理变得非常简单和直观。

4. **条件渲染和列表渲染**: 使用 `v-if`、`v-else-if`、`v-else` 和 `v-for` 指令,我们可以根据数据的状态在 DOM 中渲染不同的内容或列表。

5. **事件处理**: Vue 也提供了一种简洁的方式来处理用户输入和其他 DOM 事件。

通过这个例子,我们可以看到 Vue 3 和 Composition API 提供了一种非常高效和灵活的方式来构建复杂的用户界面,使得开发者能够以声明式的方式描述用户界面应该如何根据数据的变化来更新,而不是手动操作 DOM。这不仅使得代码更加简洁和易于理解,也提高了开发效率和应用性能。

完整代码

<template>
  <div>
    <div>
      <label for="searchId">ID:</label>
      <input id="searchId" v-model="searchId" placeholder="ID" />
    </div>
    <br>
    <div>
      <label for="searchNickname">名称:</label>
      <input id="searchNickname" v-model="searchNickname" placeholder="Nickname" />
    </div>
    <br>
    <div>
      <label for="searchTel">手机号:</label>
      <input id="searchTel" v-model="searchTel" placeholder="Tel" />
    </div>
    <br>
    <div>
      <label for="searchTitle">TiTle:</label>
      <input id="searchTitle" v-model="searchTitle" placeholder="Title" />
    </div>
    <br>
    <ul>
      <li v-for="item in filteredData" :key="item.id">
        ID: {{ item.id }}, 名称: {{ item.nickname }}, 手机号: {{ item.tel }}, Title: {{ item.title }}
      </li>
    </ul>
  </div>
</template>
<script setup>
import { ref, computed } from 'vue';
const data = ref([
    {
      "id": 89,
      "shopid": 13,
      "userid": 21,
      "total": "99.00",
      "num": "1",
      "ord_num": "2023092410299525",
      "create_time": "2023-09-24 19:52:47",
      "status": 1,
      "nickname": "昵称",
      "tel": "12372272611",
      "title": "11苹果11双卡全面屏苹果手机",
      "price": "99.00",
      "info": "推荐购买"
    },
    {
      "id": 88,
      "shopid": 13,
      "userid": 21,
      "total": "99.00",
      "num": "1",
      "ord_num": "2023092499519710",
      "create_time": "2023-09-24 08:48:44",
      "status": 1,
      "nickname": "昵称",
      "tel": "12372272611",
      "title": "11苹果11双卡全面屏苹果手机",
      "price": "99.00",
      "info": "推荐购买"
    },
    {
      "id": 87,
      "shopid": 13,
      "userid": 21,
      "total": "99.00",
      "num": "1",
      "ord_num": "2023092497515653",
      "create_time": "2023-09-24 08:44:42",
      "status": 1,
      "nickname": "昵称",
      "tel": "12372272611",
      "title": "11苹果11双卡全面屏苹果手机",
      "price": "99.00",
      "info": "推荐购买"
    },
    {
      "id": 86,
      "shopid": 13,
      "userid": 21,
      "total": "99.00",
      "num": "1",
      "ord_num": "2023092457100101",
      "create_time": "2023-09-24 08:44:41",
      "status": 1,
      "nickname": "昵称",
      "tel": "12372272611",
      "title": "11苹果11双卡全面屏苹果手机",
      "price": "99.00",
      "info": "推荐购买"
    },
    {
      "id": 85,
      "shopid": 13,
      "userid": 21,
      "total": "99.00",
      "num": "1",
      "ord_num": "2023092448101101",
      "create_time": "2023-09-24 08:40:32",
      "status": 1,
      "nickname": "昵称",
      "tel": "12372272611",
      "title": "11苹果11双卡全面屏苹果手机",
      "price": "99.00",
      "info": "推荐购买"
    },
    {
      "id": 84,
      "shopid": 9,
      "userid": 21,
      "total": "1",
      "num": "1",
      "ord_num": "2023092456545351",
      "create_time": "2023-09-24 07:53:12",
      "status": 1,
      "nickname": "昵称",
      "tel": "12372272611",
      "title": "魅鹰视力机德国技术a波光谱眼部按摩仪护眼仪儿童近散眼轴学生",
      "price": "1",
      "info": "儿童养眼"
    },
    {
      "id": 83,
      "shopid": 9,
      "userid": 21,
      "total": "1",
      "num": "1",
      "ord_num": "2023092448101545",
      "create_time": "2023-09-24 07:44:16",
      "status": 1,
      "nickname": "昵称",
      "tel": "12372272611",
      "title": "魅鹰视力机德国技术a波光谱眼部按摩仪护眼仪儿童近散眼轴学生",
      "price": "1",
      "info": "儿童养眼"
    },
    {
      "id": 82,
      "shopid": 3,
      "userid": 2,
      "total": "1",
      "num": "1",
      "ord_num": "2023091456535451",
      "create_time": "2023-09-14 14:46:16",
      "status": 1,
      "nickname": "冰海恋雨",
      "tel": "15225928729",
      "title": "顺丰包邮10斤混合组合混搭新鲜水果进口车厘子礼盒装中秋送礼高端",
      "price": "999",
      "info": "非常热爆"
    },
    {
      "id": 81,
      "shopid": 1,
      "userid": 4,
      "total": "10",
      "num": "1",
      "ord_num": "2023091310156515",
      "create_time": "2023-09-13 07:46:06",
      "status": 1,
      "nickname": "李四",
      "tel": "15225928720",
      "title": "Jordan官方耐克乔丹AJ38男子实战篮球鞋秋新款透气缓震抗扭FN7482",
      "price": "10",
      "info": "AJ"
    },
    {
      "id": 80,
      "shopid": 1,
      "userid": 9,
      "total": "10",
      "num": "1",
      "ord_num": "2023091251571024",
      "create_time": "2023-09-12 23:36:03",
      "status": 1,
      "nickname": "志昂张",
      "tel": "17839859856",
      "title": "Jordan官方耐克乔丹AJ38男子实战篮球鞋秋新款透气缓震抗扭FN7482",
      "price": "10",
      "info": "AJ"
    },
    {
      "id": 79,
      "shopid": 1,
      "userid": 4,
      "total": "10",
      "num": "1",
      "ord_num": "2023091210297569",
      "create_time": "2023-09-12 18:55:59",
      "status": 1,
      "nickname": "李四",
      "tel": "15225928789",
      "title": "Jordan官方耐克乔丹AJ38男子实战篮球鞋秋新款透气缓震抗扭FN7482",
      "price": "10",
      "info": "AJ"
    },
    {
      "id": 78,
      "shopid": 1,
      "userid": 4,
      "total": "10",
      "num": "1",
      "ord_num": "2023091249101575",
      "create_time": "2023-09-12 18:38:09",
      "status": 1,
      "nickname": "李四",
      "tel": "15223245720",
      "title": "Jordan官方耐克乔丹AJ38男子实战篮球鞋秋新款透气缓震抗扭FN7482",
      "price": "10",
      "info": "AJ"
    },
    {
      "id": 77,
      "shopid": 1,
      "userid": 4,
      "total": "10",
      "num": "1",
      "ord_num": "2023091253575549",
      "create_time": "2023-09-12 18:37:41",
      "status": 1,
      "nickname": "李四",
      "tel": "15225943230",
      "title": "Jordan官方耐克乔丹AJ38男子实战篮球鞋秋新款透气缓震抗扭FN7482",
      "price": "10",
      "info": "AJ"
    },
    {
      "id": 76,
      "shopid": 1,
      "userid": 4,
      "total": "10",
      "num": "1",
      "ord_num": "2023091297971021",
      "create_time": "2023-09-12 18:16:58",
      "status": 1,
      "nickname": "李四",
      "tel": "152123420",
      "title": "Jordan官方耐克乔丹AJ38男子实战篮球鞋秋新款透气缓震抗扭FN7482",
      "price": "10",
      "info": "AJ"
    },
    {
      "id": 75,
      "shopid": 10,
      "userid": 4,
      "total": "13.8",
      "num": "1",
      "ord_num": "2023091210255505",
      "create_time": "2023-09-12 18:14:55",
      "status": 1,
      "nickname": "李四",
      "tel": "1524567720",
      "title": "紫薯新鲜9斤农家蜜薯板栗香红沙地薯地瓜糖心蔬菜山芋小番薯包邮",
      "price": "13.8",
      "info": "紫薯新鲜9斤农家蜜薯板栗香红沙地薯地瓜糖心蔬菜山芋小番薯包邮"
    },
    {
      "id": 74,
      "shopid": 4,
      "userid": 4,
      "total": "1",
      "num": "1",
      "ord_num": "2023091210048559",
      "create_time": "2023-09-12 18:14:37",
      "status": 1,
      "nickname": "李四",
      "tel": "15267898720",
      "title": "正版 华晨宇同款李宁防泼水外套 | 2023秋季新款开衫防风运动服男女款",
      "price": "1",
      "info": "好穿不贵"
    },
    {
      "id": 73,
      "shopid": 1,
      "userid": 4,
      "total": "10",
      "num": "1",
      "ord_num": "2023091250501011",
      "create_time": "2023-09-12 17:44:18",
      "status": 1,
      "nickname": "李四",
      "tel": "15225456720",
      "title": "Jordan官方耐克乔丹AJ38男子实战篮球鞋秋新款透气缓震抗扭FN7482",
      "price": "10",
      "info": "AJ"
    },
    {
      "id": 72,
      "shopid": 1,
      "userid": 4,
      "total": "10",
      "num": "1",
      "ord_num": "2023091210048491",
      "create_time": "2023-09-12 17:42:53",
      "status": 1,
      "nickname": "李四",
      "tel": "15225928720",
      "title": "Jordan官方耐克乔丹AJ38男子实战篮球鞋秋新款透气缓震抗扭FN7482",
      "price": "10",
      "info": "AJ"
    }
]);
const searchId = ref('');
const searchNickname = ref('');
const searchTel = ref('');
const searchTitle = ref('');
const filteredData = computed(() => {
  return data.value.filter(item => {
    return (
      (!searchId.value || item.id.toString().includes(searchId.value)) &&
      (!searchNickname.value || item.nickname.toLowerCase().includes(searchNickname.value.toLowerCase())) &&
      (!searchTel.value || item.tel.includes(searchTel.value)) &&
      (!searchTitle.value || item.title.toLowerCase().includes(searchTitle.value.toLowerCase()))
    );
  });
});
</script>
相关文章
|
7天前
|
资源调度 JavaScript 前端开发
Pinia 如何在 Vue 3 项目中进行安装和配置?
Pinia 如何在 Vue 3 项目中进行安装和配置?
|
4月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
150 64
|
4月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
196 64
|
4月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
186 60
|
4月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
159 58
|
4月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
135 56
|
2月前
|
资源调度 JavaScript 前端开发
创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】
这是一篇关于创建Vue项目的详细指南,涵盖从环境搭建到项目部署的全过程。
274 1
|
3月前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
173 3
|
4月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
107 17
|
4月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。