vue-music 关于搜索历史本地存储

搜索历史 搜索过的关键词 保存在本地存储 localstorage 中,同时多个组件共享搜索历史数据,将数据存到vuex 中,初始值从本地缓存中取得对应key 的值,没有数据默认为空数组

点击搜索关键词列表值的时候触发将关键词写入vuex 中,搜索结果列表suggest 组件向外派发事件,在需要渲染搜索历史列表的组件接受派发的事件提交actions 保存结果

封装actions 方法saveSearchHistory 提交commit 将

创建cache.js 在提交之前把关键词存放到本地存储中,cache.js 实现所有跟本地存储相关的逻辑。因为原生的localstorage api 需要将数组转换为字符串存储,相对麻烦,所以用good-storage 插件直接存数组

缓存到本地的数据最大缓存15条,并且新的插入在第一位,首先得到当前的存储数据情况,将关键字存到数组中,判断如果数组中有相同的数据,则把重复的数据删除,将新的关键字存入到前面

将插入数组判断的逻辑封装成insetArray 方法

function insertArray(arr, val, compare, maxLen) {        // 当前数组,插入的值,比较是否有重复项函数,存储最大值
  const index = arr.findIndex(compare)    // 获取比较不同定义的查找函数,获取数组中对应的索引值
  if (index === 0) {    //如果是第一条数据则退出,原样返回数组
    return
  }
  if (index > 0) {    // 如果有数据,不是在第一位,则删除该重复数据
    arr.splice(index, 1)
  }
  arr.unshift(val)    // 将新值插入到第一位
  if (maxLen && arr.length > maxLen) {      //判断数组长度超出定义的长度,把数组的最后一位移除
    arr.pop()
  }
}

使用存储到本地缓存中。并返回一个已经筛选完的数组,可以用于存到vuex中

export function saveSearch(query) {
  let searches = storage.get(SEARCH_KEY, [])
  insertArray(searches, query, (item) => {
    return item === query        // 比较获取的数组中有没有新值
  }, SEARCH_MAX_LEN)        // 存储最大值
  storage.set(SEARCH_KEY, searches)    //存入本地存储
  return searches
}

在actions 中调用

import {saveSearch} from ‘common/js/cache‘

export const saveSearchHistory = function({commit},query){
  commit(types.SET_SEARCH_HISTORY,saveSearch(query));
} 

删除一条搜索历史数据,点击删除,派发一个delete 事件,search 组件监听到事件提交一个action 从vuex 和缓存 中删除该条数据

删除逻辑和保存差不多,判断是否在缓存数组中有要删除的数据索引,如果有则删除,并更新缓存和vuex 数据

function deleteFromArray(arr, compare) {
  const index = arr.findIndex(compare)
  if (index > -1) {
    arr.splice(index, 1)
  }
}

export function deleteSearch(query) {
  let searches = storage.get(SEARCH_KEY, [])
  deleteFromArray(searches, (item) => {
    return item === query
  })
  storage.set(SEARCH_KEY, searches)
  return searches
}

actions

export const deleteSearchHistory = function({commit},query){
  commit(types.SET_SEARCH_HISTORY,deleteSearch(query));
} 

删除监听

<span class="icon" @click.stop="deleteOne(item)">

<search-list :searches="searchHistory" @select="addQuery" @delete="deleteSearchHistory"></search-list>
// 监听派发事件直接指向actions 中定义的方法

点击清空所有搜索历史数据直接将缓存数组设置为空即可

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

最近播放列表 也需要存储在本地和vuex 中,在state.js 中设置playHistory:loadPlay() ,从缓存中获取初始值。当歌曲ready 播放的时候,写入数据actions 提交savePlayHistory,传入当前歌曲信息currentSong

插入存储套路个 搜索历史一样,比较函数 条件为song.id === item.id  比较当前歌曲的id  有没有相同的歌曲

export function savePlay(song) {
  let songs = storage.get(PLAY_KEY, [])
  insertArray(songs, song, (item) => {
    return song.id === item.id
  }, PLAY_MAX_LEN)
  storage.set(PLAY_KEY, songs)
  return songs
}

点击最近播放列表,插入当前播放列表中,并且如果点击的最近播放列表不在第一位,则替换到第一位

selectSong(song, index) {
  if (index !== 0) {
    this.insertSong(new Song(song))
    this.$refs.topTip.show()
  }
},

添加收藏和删除收藏 歌曲的套路也一样

从界面角度操作点击收藏样式和功能 通过设置计算属性 根据判断当前歌曲是否在vuex 中存储,如果有的话则删除,没有的话则收藏。不同组件中有相同的收藏功能和逻辑的话,可以写在mixin 中共享调用

getFavoriteIcon(song){
    if(this.isFavorite(song)){
        return ‘icon-favorite‘
    }
    return ‘icon-not-favorite‘
},
toggleFavorite(song){
    if(this.isFavorite(song)){
        this.deleteFavoriteList(song)
    }else{
        this.saveFavoriteList(song);
    }
},
isFavorite(song){
    const index = this.favoriteList.findIndex((item)=>{
        return item.id == song.id
    })
    return index > -1
},

原文地址:https://www.cnblogs.com/catbrother/p/9180526.html

时间: 2024-10-20 02:09:57

vue-music 关于搜索历史本地存储的相关文章

Vue 商城的一些小demo(后台添加商品、前台购物车、本地存储的使用)

demo   商城后台,添加一种商品 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <!-- 引入vue.js --> <script src="js/vue.js"></script> </head> <body> <div id=&

vue-music 关于Search(搜索页面)-- 搜索历史

搜索历史展示每一次搜索过,并选中的关键字,保存数据到数组.搜索历史数据是需要在多个组件中共享的,所以保存在vuex 中 searchHistory 数组中,保存触发在搜索列表点击选中之后派发事件到search.vue 中,search.vue 监听事件并提交actions改变共享数组,改变vuex 中共享数据之前需要存到本地缓存 Localstorage 中,在本地存储 中判断如果当期历史搜索数据在数据中已经有则提前插入到第一位,没有则添加到数组中存储 在common 中 创建cache.js

esxi宿主机的本地存储-非活动

今天忽然发现DRS中一台ESXI主机的本地存储不可以,主机资源可用 琢磨了好久,也在网上搜索了好久,一直没有解决的办法. 不得已到机房,用kvm连接. 重启计算机 发现居然无法启动,卡在DHCP... 这里,莫名其妙,启动顺序没改呀,到F2去看下 修改 启动正常,打算磁盘还是不可用 重启进入raid阵列,发现所有磁盘都处于foreign,于是在foreign下,把VG的foreign --- import 结果阵列信息正常,退出重启,esxi正常

Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载

目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式 3.Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载 4.Chrome扩展开发之四——Gmail API的简单介绍 5.Chrome扩展开发之五——OAuth2的理解 6.Chrome扩展开发之六——GmailAssist核心功能的实现(包括Gmail API的使用中的

HTML5规范的本地存储

在HTML5 中定义了两种本地存储的,Web Storage 和本地数据库 SQL Database . 用来检查判断浏览器是否支持 Web Storage if(window.localStorage){ //浏览器支持localStorage } if(window.sessionStorage){ //浏览器支持sessionStorage } localStorage 主要作用是将数据保存在客户端中,也就是用户的计算机上. 是基于域的,在该域的任何网页都可以访问,在不同设备上存储的是不同

html5的本地存储

正好刚刚写了javaweb的session存储,反正还早....就把html5的本地存储一块写了吧 cookie 在说html5的本地存储之前,不得不说下在它之前的本地存储cookie. cookie存储在浏览器端,并且会随着浏览器的请求一起传到服务器段,它有一定的过期时间,到了过期时间会自动消失. 小伙伴么可以打开浏览器自己看一下 默认生命周期是浏览器关闭.当然你任性,也可以自己设置 1 Response.Cookies(name).Expires = Date +1; (时间函数+N) ja

本地存储浅析

 相比于桌面应用,Web应用在本地存储方面确实显得有点力不从心.在桌面应用,你可以使用INI或者XML等文件来保存配置和数据,甚至可以使用内嵌小型数据库的方法去保存数据,而对于网站来说,在很长的一段时间里,我们只能使用Cookies这个充满缺点但又无法替代的东西.不过随着互联网的发展,本地存储技术也一直在发展,但始终没有出现一个能满足需求的技术,直到Web Storage的出现. 下面我们来看下一些比较常见的本地存储技术. Cookies 这个由Netscape的前雇员Lou Montulli在

HTML5 本地存储

说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个cookies,太少了.优势就是大家 都支持,而且支持得还蛮好.很早以前那些禁用cookies的用户也都慢慢的不存在了,就好像以前禁用javascript的用户不存在了一样. userData是IE的东西,垃圾.现在用的最多的是Flash吧,空间是Cookie的25倍,基本够用.再之后Google推出了

HTML5 本地存储 LocalStorage

说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个cookies,太少了.优势就是大家 都支持,而且支持得还蛮好.很早以前那些禁用cookies的用户也都慢慢的不存在了,就好像以前禁用javascript的用户不存在了一样. userData是IE的东西,垃圾.现在用的最多的是Flash吧,空间是Cookie的25倍,基本够用.再之后Google推出了