IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> vue 搜索框添加历史搜索记录 -> 正文阅读

[游戏开发]vue 搜索框添加历史搜索记录

笔者vue项目有一个需求,搜索框添加历史搜索记录。想着很久没更新博客了,记录一下吧。
PS:pinia+vue3+vant+ts,或许你在使用vue2的语法,不要紧,可以根据自己的需求简单改改。

效果图

在这里插入图片描述

正文

搜索框的逻辑就不介绍了,今天这个问题其实是vue操作localStorage。笔者先写了一个工具类来完成对缓存的操作:

export class CacheManager {
  static getHomeSearchHistoryWords() {
    return localStorage.getItem("home-search-history-words")?.split(",") ?? [];
  }

  static setHomeSearchHistoryWords(words: string) {
    return localStorage.setItem("home-search-history-words", words);
  }

  static clearHomeSearchHistoryWords() {
    localStorage.removeItem("home-search-history-words");
  }
}
  • 双问号的作用是左表达式为空或undefined时,会取右表达式的值
  • getHomeSearchHistoryWords 为读取历史搜索记录,返回值为数组;setHomeSearchHistoryWords 为写入,参数为String类型;clearHomeSearchHistoryWords 为清空。

html如下

    <div class="history-words" v-if="words.length">
      <div class="history-words-header">
        <h4>历史搜索</h4>
        <span class="clear" @click="searchStore.clearWords">清空</span>
      </div>
      <Tag
        v-for="item in words"
        style="margin-left: 10px"
        @click="searchStore.onTagClick(item)"
        >{{ item }}</Tag
      >
    </div>
  • Tag 标签是vant中的组件
  • searchStore为pinia定义的状态管理容器
  • words为pinia中的状态,即历史搜索记录

pinia代码如下

export const HomeSearchStore = defineStore("home-search", {
  state: () => ({
    query: "",
    list: [],
    words: [] as string[],
  }),
  actions: {
    search(pushToWords = true) {
	  /**
	  * 这是你的请求,成功后继续执行
	  * do something...
	  */
	  
      if (pushToWords) this.pushWord(this.query);
    },
    onTagClick(item: string) {
      this.query = item;
      this.search(false);
    },
    pushWord(word: string) {
      this.words.unshift(word);
      this.words = Array.from(new Set(this.words)).slice(0, 10);

      CacheManager.setHomeSearchHistoryWords(this.words.join(","));
    },
    setWords(words: string[]) {
      this.words = CacheManager.getHomeSearchHistoryWords();
    },
    clearWords() {
      this.words = [];
      CacheManager.clearHomeSearchHistoryWords();
    },
  },
});
  • 请注意对应html与pinia中函数的调用关系
  • 在其中定义的状态,如 words,在vue2写法就是你data函数返回对象中的一员;其中定义的函数,则在你methods中定义
  • search 函数,你的搜索框发起请求所调用的函数,它的参数 pushToWords(是否存入历史搜索记录)是因为我的需求:点击历史搜索记录或热门标签所发起的请求不会把标签中的内容存入历史搜索记录中(换句话说,只有搜索框中输入内容,然后点击搜索的,才会存入) 而决定的。如果你没有此类需求,可以去掉。
  • onTagClick 如上
  • pushWord 将此次搜索的内容存入words,首先使用 js数组方法 unshift 将 内容存放在words第一位。然后使用Set方法进行数组去重。这样的好处是,发生重复时,会将与以前那一个重复词语删除,会保证顺序性。最后将数组转为字符串存入缓存。
  • setWords 这个函数会在 onMounted 函数中调用,用于在进入页面时,读取缓存中的历史搜索记录
  • clearWords 清空
    到这里其实就完成了。

遇到的问题

笔者刚开始的时候,并不是这样写的。起初没有定义words变量,在html中的所有操作都是直接调用工具类中的函数,也就意味着直接调用缓存的数据。测试时,笔者发现,输入框输入内容后搜索,历史搜索记录正确更新。但是点击清空却没有任何反应,刷新页面才会生效。
为什么一些内容好用,而一些内容不好用呢?在调查过后,找到了原因

  • vue驱动页面更新的是数据,在搜索框输入内容后搜索,笔者所用代码会走网络请求,这个请求在成功时会返回一个数组,我会把这个数组赋值给 list 变量,在页面我使用到 list 来渲染搜索结果的列表。每一次搜索,都会触发数据变化,进而触发页面更新,进而重新调用 getHomeSearchHistoryWords。
  • 而清空操作,没有走网络请求,也就意味着数据没有发生变化,页面也没有更新,于是就没有调用 getHomeSearchHistoryWords。
  • 解决方法就像以上的代码,自己维护一个 words 变量,保证响应式更新。

结束

如果对你有帮助的话,请点一个👍🏻吧~

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 13:05:27  更:2022-05-09 13:06:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:01:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码