vue项目搜索历史功能的实现

摘要:
对于播放器项目中的歌曲搜索页面,首先在状态中定义搜索历史,然后在状态中保存搜索历史。js://Search history:searchHistory:[]mutations添加更改搜索历史突变的方法。js:SET_SEARCH_HISTORY(状态,历史){state.searchHistory=HISTORY}需要在操作中提交状态更改历史

播放器项目中歌曲搜素页面的

首先需要在state定义搜索历史,在其中保存搜索历史

state.js:
// 搜索历史: searchHistory: []

 mutations中新增改变搜索历史的方法

mutations.js:
SET_SEARCH_HISTORY(state, history) { state.searchHistory = history }  

在actions中需要提交一个状态改变history,由于需要存储到vuex中

export const saveSearchHistory = function ({
  commit
}, query) {
  commit('SET_SEARCH_HISTORY', saveSearch(query))
}  

在utils中新建一个cache.js,用来存储localstroage.js,首先安装good-stroage作为存储缓存的依赖

cache.js:
import storage from 'good-storage';
定义一个key代表存储搜索历史:
const SEARCH_KEY = "__search__"
// 只缓存十五条数据
const SEARCH_MAX_LEN = 15

 实现逻辑:

// arr总数组,val插入的数组,maxlen总条数
function insertArray(arr, val, maxLen) {
  const index = _findIndex(arr, val);
  // 如果搜到第一条数据返回即可
  if (index === 0) {
    return
  }
  // 如果数组中有这条数据,还不是在最前面,则删除之前的数据
  if (index > 0) {
    arr.splice(index, 1);
    console.log('删除已存在的数据')
  }
  // 把当前的插入最前面
  arr.unshift(val)
  // 当存储的长度大于设置的长度则移除最后一条:
  if (maxLen && arr.length > maxLen) {
    arr.pop()
  }
}
export function saveSearch(query) {
  // 获取当前,如果没有存过则是空数组:
  let searches = storage.get(SEARCH_KEY, [])
  insertArray(searches, query, SEARCH_MAX_LEN);
  storage.set(SEARCH_KEY, searches);
  return searches
}

// 遍历数组对象,找到插入值的索引(这个方法其实不太好,其实就是把对象转换成字符串后向后不断对比,应该根据id来判断是否一致)
function _findIndex(l, o) {
  var objStr = JSON.stringify(o)
  return l.reduce((index, ele, i) => {
    if (JSON.stringify(ele) === objStr) {
      return i
    } else {
      return index
    }
  }, -1)
}

在搜素结果的组件中,给每一项添加一个点击事件,传递值,并让父组件监听:

  selectItem(item) {
      this.$emit("select", item);
   },

父组件中监听,并使用mapActions提交变化

  methods: {
    async _getSearchHot() {
      const { data: res } = await getSearchHot();
      this.hotSearchList = res.slice(0, 8);
      console.log(this.hotSearchList);
    },
    ...mapActions(["saveSearchHistory"]),
    onSaveSearch(item) {
      this.saveSearchHistory(item);
    }
  }

 在浏览器中测试,分别输入一首海阔天空和光辉岁月,可以看到前一步提交和后一步提交的状态

vue项目搜索历史功能的实现第1张

 这时候再搜索第一次搜索的海阔天空,会把之前的删除,并新增一条海阔天空插入到数组最前面

vue项目搜索历史功能的实现第2张

 在浏览器的控制台中的Application也可以查看到localstroage的变化

vue项目搜索历史功能的实现第3张

接下来就是定义一个基础组件,把所有历史记录使用mapGetters获取,并循环遍历

<template>
  <div   v-show="searches.length">
    <ul>
      <li v-for="(item,index) in searches" :key="index" >
        {{item.name}}
        <i   ></i>
      </li>
    </ul>
  </div>
</template>

  到此页面也渲染完成了

 vue项目搜索历史功能的实现第4张

 接下来实现点击播放历史记录中的歌曲,和删除历史记录中的歌曲,因为是基础组件,所以向外暴露出事件让父组件监听

      <li v-for="(item,index) in searches" :key="index" @click="selectItem(item)">
        {{item.name}}
        <i   @click.stop="deleteTag(item)"></i>
      </li>

 

  methods: {
    selectItem(item) {
      this.$emit("select", item);
    },
    deleteTag(item) {
      this.$emit("delete", item);
    }
  }

父组件中监听

<search-list :searches="searchHistory" @select="selectItem" @delete="deleteSearch"></search-list>

播放点击的歌曲很简单,使用之前定义的mapactions中的insertSong即可,之前歌曲的数据也都一一传入

   selectItem(item) {
      this.insertSong(item);
    },

 删除播放的历史记录中的歌曲,需要 定义一个新的actions,把之前的history重新删掉选中项后再返回结果

export const deleteSearchHistory = function ({
  commit
}, query) {
  commit('SET_SEARCH_HISTORY', deleteSearch(query))
}

 在cache.js中新增方法

// 从数组删除方法:
function deleteFromArray(arr, val) {
  const index = _findIndex(arr, val);
  if (index > -1) {
    arr.splice(index, 1)
  }
}

// 删除搜索历史的某一项:
export function deleteSearch(query) {
  let searches = storage.get(SEARCH_KEY, []);
  deleteFromArray(searches, query);
  // 删除完再保存数组:
  storage.set(SEARCH_KEY, searches);
  // 同时返回被删除的数组
  return searches
}

最后在父组件中定义子组件的删除事件中调用actions并传入item即可

   deleteSearch(item) {
      this.deleteSearchHistory(item);
    }

点击后测试效果,可以发现已经成功了

vue项目搜索历史功能的实现第5张

 vue项目搜索历史功能的实现第6张

 最后实现点击垃圾清空全部历史记录的功能,这个就很简单了

一样的方法定义一个actions

// 点击垃圾桶,删除全部历史记录
export const clearSearchHistory = function ({
  commit
}) {
  commit('SET_SEARCH_HISTORY', clearSearch())
}

cache.js新增一个清除全部的函数

export function clearSearch() {
  storage.remove(SEARCH_KEY)
  return []
}

 点击时候调用即可,在这里用了vant的dialog组件

    deleteAllHis() {
      Dialog.confirm({
        message: "是否清空历史记录?",
        className: "dialog_themedark",
        confirmButtonText: "清空",
         "250px"
        // transition: "zoomIn"
      }).then(() => {
        this.clearSearchHistory();
      });
    }

 效果

vue项目搜索历史功能的实现第7张

 点击后全部清空

vue项目搜索历史功能的实现第8张

到此,搜索历史的功能也就做完了 

  

  

 

 

  

免责声明:文章转载自《vue项目搜索历史功能的实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TP5操作日志记录设计C#服务器全面讲解与制作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JavaScript中DOM操作文档对象模型获取标签内容

DOM操作文档对象模型获取标签内容一、通过id属性值获取标签对象(只能获取一个标签对象) document.getElementById('id属性值') //获取标签页中id为div1的标签对象 var oDiv1 = document.getElementById('div1'); //输出为id为id为div1的标签内容 console.log(oD...

vue中通过hls.js播放m3u8格式的视频

近期做了一个功能,是接入一个海康的摄像头的监控视频,怎么获取m3u8的视频这里就不在叙述了,只说一下怎么将m3u8格式的视频成功播放 一、m3u8和HLS介绍 1.M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。 2.HLS 与...

java List接口一

一 List接口概述   查阅API,看List的介绍。有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的 插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的 元素。与 set 不同,列表通常允许重复的元素。 看完API,我们总结一下:   List接口:   它是一个元素存取有序的集合...

vue项目使用static目录存放图片解决方案

我个人喜欢把所有引用文件全部放在打包文件src的同级文件static文件内部,方便整合。 提醒:vue项目中正常情况下图片是由 url-loader 处理,加入了hash值,如果放到static里面webpack打包后只会把资源复制到发布目录而不会把小图片优化为base64。 如果我们使用static目录存放图片会以为打包而产生一系列路径问题 总结来说有以...

FileStream的读取和写入

使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。  先看代码,后面讲解: using System;using System.Collections.Gener...

lua内存管理

本文内容基于版本:Lua5.3.0 Lua内存管理器规则 Lua允许用户自定义内存管理器,并在创建Lua虚拟机(lua_State实例)时传入。当然自定义内存管理器必须遵循Lua已定义的一些行为规则。创建一个Lua虚拟机需要使用luaL_newstate函数: lua_State *L = luaL_newstate(); luaL_newstate函数的...