Vue3+vant 带你实现常见的历史记录的业务功能

前言

大部分小伙伴不管是开发PC端还是H5移动端,都会遇到历史搜索的功能。对用户的历史记录进行增删查可以是接口,也可以是前端用缓存实现,一般用浏览器缓存实现的比较多,这篇文章就来教你如何用LocalStorage对历史记录数据的存储、获取、删除。
版本号:vue3.3,vant4,css样式以750设计稿去写的。

先看效果图

在这里插入图片描述
主要核心功能:获取搜索记录、设置搜索记录、清空所有历史记录、点击搜索

1、获取搜索记录

调用时机:
1、首次进页面先获取缓存的历史记录参数searchHistory
2、删除所有历史记录后重新获取以更新页面。

  • 如果没有,则为它生成一个并赋值为空串,为了方便给后面添加。
  • 如果有,则将searchHistory以逗号切割为数组,同时过滤掉空串的,供页面遍历历史参数正常展示用。
    处理前:'哈哈哈,哈哈哈2321, , '
    处理后:['哈哈哈','哈哈哈2321']
const searchHistory = ref([]) // 存储历史搜索参数const getHistory = () => {var obj = window.localStorage.getItem('SearchHistory')if (obj == null) {localStorage.setItem('SearchHistory', '')searchHistory.value = []} else {// 将数组中空串的元素删除返回新数组searchHistory.value = obj.split(',').filter(v => v !== undefined && v !== null && v !== '')}// console.log(searchHistory.value, 'searchHistory.value')
}onMounted(() => {getHistory()
})

2、设置搜索记录

调用时机:这个是在点击搜索时调用的。
先获取SearchHistory,把用户新搜索的值放入用indexOf去重

  • 已存在不拼接
  • 不存在,则在现有的SearchHistory基础上后面拼接上新搜索参数,并为新搜索参数添加逗号,方便查询时以逗号切割。
    注意:为什么是拼接,因为SearchHistory本身就是一个字符串。
const setHistory = value => {var his = window.localStorage.getItem('SearchHistory')if (his.indexOf(value) != -1) {return false} else {window.localStorage.setItem('SearchHistory', his + value + ',')}
}

3、清空所有历史记录

直接将整个SearchHistory删除并重新获取,以达到更新的状态。

const clearHistory = () => {showConfirmDialog({title: '',message: '您确定删除全部历史纪录吗?',}).then(() => {window.localStorage.removeItem('SearchHistory')getHistory()}).catch(() => {})
}

4、点击搜索

将搜索框的值两边去空格后存入缓存中setHistory。
status:1和2是为了实现两个功能

  • 1、正常用户点击搜索后直接去到商品列表了,跳转前需要将此查询参数保存起来。
  • 2、用户直接在历史记录中点击任意一个就跳转到商品列表(不是点搜索的)。
// storageParams:历史搜索参数
// 1是手动输入查询  2是点击历史查询
const onSearch = (status, storageParams) => {let searchTrim = searchVal.value.trim()// 如果搜索内容为空并且不存在  或者历史搜索参数为空并且不存在  则弹窗提示用户if ((searchTrim == '' && searchTrim == null) || (storageParams == '' && storageParams == null)) {showDialog({title: '提示',message: '没有找到该商品',}).then(() => {})} else {// 手动搜索if (status == 1) {setHistory(searchTrim)// 历史的搜索} else if (status == 2 && storageParams) {}}getHistory()
}

完整代码

<script setup>
import { onMounted, ref } from 'vue'
import { showDialog, showConfirmDialog } from 'vant'const searchVal = ref('') // 搜索参数
const searchHistory = ref([]) // 存储历史搜索参数
const isSearchResult = ref(false) // 是否有查询结果  true为有  false为没有// storageParams:历史搜索参数
// 1是手动输入查询  2是点击历史查询
const onSearch = (status, storageParams) => {let searchTrim = searchVal.value.trim()// 如果搜索内容为空并且不存在  或者历史搜索参数为空并且不存在  则弹窗提示用户if ((searchTrim == '' && searchTrim == null) || (storageParams == '' && storageParams == null)) {showDialog({title: '提示',message: '没有找到该商品',}).then(() => {// on close})} else {// 手动搜索if (status == 1) {setHistory(searchTrim)// 历史的搜索} else if (status == 2 && storageParams) {}}getHistory()
}
// 设置搜索记录
const setHistory = value => {var his = window.localStorage.getItem('SearchHistory')if (his.indexOf(value) != -1) {return false} else {window.localStorage.setItem('SearchHistory', his + value + ',')}
}
// 获取搜索记录
const getHistory = () => {var obj = window.localStorage.getItem('SearchHistory')if (obj == null) {localStorage.setItem('SearchHistory', '')searchHistory.value = []} else {// 将数组中空串的元素删除返回新数组searchHistory.value = obj.split(',').filter(v => v !== undefined && v !== null && v !== '')}// console.log(searchHistory.value, 'searchHistory.value')
}
// 清空所有历史记录
const clearHistory = () => {showConfirmDialog({title: '',message: '您确定删除全部历史纪录吗?',}).then(() => {window.localStorage.removeItem('SearchHistory')getHistory()}).catch(() => {})
}onMounted(() => {getHistory()
})
</script>
<template><div class="container"><!-- 搜索 --><div class="searchBox"><van-search v-model="searchVal" show-action label="" placeholder="请输入搜索关键词"><template #action><div @click="onSearch(1, null)">搜索</div></template></van-search></div><!-- 历史搜索 --><div class="historyBox"><div class="titleBox">历史搜索<span class="delete_sp" @click="clearHistory"><van-icon name="delete" /></span></div><div class="storageSearchParams"><div v-for="(item, index) in searchHistory" :key="index" class="item" @click="onSearch(2, item)">{{ item }}</div></div></div></div>
</template><style scoped lang="scss">
.container {width: 100%;background: white;.searchBox {padding: 20px 0 20px 24px;box-sizing: border-box;height: 108px;background-color: white;.search-content {height: 100%;display: flex;.search-back {width: 86px;height: 100%;text-align: left;line-height: 70px;font-size: 40px;text-indent: 0.1em;}.search-left {flex: 1;display: flex;position: relative;.fixed-icon {position: absolute;top: 18px;left: 20px;}.ipt-search {flex: 1;border-radius: 40px;background-color: #f7f8fa;text-indent: 2.4em;font-size: 26px;// color: #969799;}}.search-right {width: 88px;height: 100%;display: flex;justify-content: center;align-items: center;font-size: 28px;}}}.titleBox {font-weight: bold;padding-top: 40px;margin-left: 1rem;font-size: 30px;line-height: 40px;}.storageSearchParams {display: flex;flex-wrap: wrap;align-items: center;margin: 15px;.item {background-color: #fff;padding: 18px;color: black;border: 1px solid #f7f8fa;// border-radius: 20px;font-size: 26px;margin-right: 10px;}}
}
::v-deep(.van-search__content) {background: #f7f8fa;
}
::v-deep(.van-search__content--round) {border-radius: 40px;
}
::v-deep(.van-search__field) {align-items: center;
}
.delete_sp {float: right;font-size: 38px;color: rgb(153, 153, 153);vertical-align: middle;margin-right: 20px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视创云展元宇宙虚拟展厅,带来沉浸式的逛展体验!

近年来&#xff0c;随着科技的飞速发展和市场需求的不断演变&#xff0c;众多企业纷纷将目光转向线上虚拟展厅的建设。视创云展元宇宙虚拟展厅凭借其创新性和实用性&#xff0c;为众多企业带来了前所未有的宣传体验&#xff0c;成为了商企展示自我、推广产品的全新舞台。 与传统…

Java 生成SSL证书

第一步&#xff1a; cmd打开指令窗口 第二步&#xff1a; 运行指令&#xff1a; keytool -keystore hk.jks -storepass 123456 -deststoretype jks -genkeypair -keyalg RSA -validity 365 -alias contrastserver -dname "CN111.230.63.59, OUHK, OHK, LZH, STGD, CCN&…

XSKY对象存储深度结合Alluxio分布式缓存系统,GPU利用率提高至90%以上

近日&#xff0c;Alluxio分布式缓存系统完成了与XSKY星辰天合的 XEOS V6.4 对象存储的兼容性测试&#xff0c;旨在解决数据管理和加速方面的挑战。双方进行了深度的产品对接和联合开发&#xff0c;将 Alluxio 分布式缓存系统与 XEOS 对象存储的众多应用特性进行结合&#xff0c…

38. 【Java教程】日期和时间处理

本小节我们将学习 Java 中的日期和时间&#xff0c;日期和时间在我们的实际开发中非常常用&#xff0c;例如用户的注册、数据的增删改、对敏感信息的操作等等都需要记录下日期和时间。通过本小节的学习&#xff0c;你将了解到什么是日期、什么是时间、什么是时区&#xff0c;Ja…

3072. 将元素分配到两个数组中 II

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…

WebGL画粗线

目录 前言 基本思路 求左右端点 实现 组织数据 顶点着色器计算端点坐标 效果 前言 WebGL绘制模式有点、线、面三种&#xff1b;通过点的绘制可以实现粒子系统等&#xff0c;通过线可以绘制一些连线关系&#xff1b;面就强大了&#xff0c;通过面&#xff0c;我们可以…

视频监控汇聚平台LntonCVS国标GB28181协议实现语音对讲功能

在当今这个智能技术飞速发展的时代&#xff0c;人工智能已经成为了电子产品领域的一股不可忽视的热门趋势。随着科技的不断进步&#xff0c;越来越多的电子产品开始融入人工智能技术&#xff0c;从而为其开拓了全新的发展路径。在这个大背景下&#xff0c;安防摄像头无插件直播…

基于springboot实现智慧校园之家长子系统项目【项目源码】计算机毕业设计

基于springboot实现智慧校园之家长子系统演示 SpringBoot框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SpringBoot&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SpringBoot、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c…

【学习】测试用例设计与执行的黄金法则

在软件测试领域&#xff0c;测试用例的设计与执行是确保产品质量的关键环节。一个优秀的测试用例能够揭示软件中的缺陷&#xff0c;而高效的执行则能保障测试覆盖的全面性。如同璀璨的星辰指引航船前行&#xff0c;以下黄金法则将引领测试用例设计与执行的过程&#xff0c;确保…

Go 群发邮件Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8 go get gopkg.in/gomail.v2 二、使用"gopkg.in/gomail.v2"群发 package mainimport (gomail "gopkg.in/gomail.v2" )func main() {// 邮件内容m : gomail.NewMessage()m.SetHeader("From", &qu…

【杂谈】AIGC之Stable Diffusion:AI绘画的魔法

Stable Diffusion&#xff1a;AI绘画的魔法 引言 在AI的世界里&#xff0c;Stable Diffusion就像一位魔法师&#xff0c;它能够将我们脑海中的幻想&#xff0c;用画笔一一描绘出来。今天&#xff0c;就让我们一探这位魔法师的奥秘&#xff0c;看看它是如何从无到有&#xff0…

安装MongoDB单副本说明

参考&#xff1a;https://blog.csdn.net/weixin_43464076/article/details/126509254 https://driverzhang.github.io/post/mongo%E5%BC%80%E5%90%AF%E4%BA%8B%E5%8A%A1%E4%B9%8B%E5%89%AF%E6%9C%AC%E9%9B%86%E9%87%87%E5%9D%91/ https://dev.to/alexalvess/getting-started-wi…

实习面试题(答案自敲)、

1、为什么要重写equals方法&#xff0c;为什么重写了equals方法后&#xff0c;就必须重写hashcode方法&#xff0c;为什么要有hashcode方法&#xff0c;你能介绍一下hashcode方法吗&#xff1f; equals方法默认是比较内存地址&#xff1b;为了实现内容比较&#xff0c;我们需要…

mysql表级锁(表锁/元数据锁/意向锁)

文章目录 表级锁的分类1、表锁(分类)1.表共享读锁&#xff08;read lock&#xff09;2.表独占写锁&#xff08;write lock&#xff09;3.语法&#xff1a; 2、元数据锁&#xff08;meta data lock &#xff09;3、意向锁1.意向共享锁&#xff08;IS&#xff09;&#xff1a;由语…

【wiki知识库】05.分类管理实现--前端Vue模块

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日目标 二、&#x1f30f;前端部分的改造 2.1 新增一个tool.ts 2.2 新增admin-categoty.vue 2.3 添加新的路由规则 2.4 添加the-welcome.vue 2.5 修改HomeView.vue 三、❗注意 一、&…

车来了冲刺上市:业绩波动明显,依赖广告业务,滴滴、阿里入股

近日&#xff0c;MetaLight Inc.&#xff08;下称“元光科技”或“车来了”&#xff09;向港交所递交招股说明书&#xff0c;中金公司为其独家保荐人。 据招股书介绍&#xff0c;元光科技专注于利用时序数据&#xff08;按时间顺序排列的数据点&#xff09;来发现及预测分析对…

docker 存储 网络 命令

文章目录 1 docker存储1.1 目录挂载2.1卷映射2.1.1卷映射和目录挂载的区别2.1.2卷映射的使用 2 docker网络2.1查看docker的默认网络2.2查看容器的IP2.3容器互通2.4自定义网络2.4.1 创建自定义网络2.4.2创建容器的时候加入到自定义的网络2.4.3使用域名进行容器之间的访问2.4.4re…

盛凌电子IPO终止:实控人蒋志坚曾和前妻黄新打官司,儿子已离职

保荐人撤销&#xff0c;致使公司IPO终止。 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;深圳盛凌电子股份有限公司&#xff08;下称“盛凌电子”&#xff09;的保荐人申万宏源证券撤回上市申请文件。因此&#xff0c;深圳证券交易所决定终止对该公司首次公开发行…

Qt报错:libvlc开发的程序,出现Direct3D output全屏窗口

问题描述&#xff1a; 在qt中开发重播模块时&#xff0c;第一次在窗口正常播放&#xff0c;点击重播按钮后会弹出新的Direct3D output窗口播放视频 分析&#xff1a; 因为libvlc_media_player_set_hwnd 这个函数 设置了不存在的窗口句柄&#xff0c;导致vlc视频播放窗口没有嵌…

kubesz(一键安装k8s)

引言 Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。kubeasz 是一个用于快速搭建 Kubernetes 高可用集群的项目&#xff0c;它基于 Ansible&#xff0c;通过提供一套简单、易用的配置&#xff0c;使得…