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 数据
cache.js
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
},
<i class="icon" @click="toggleFavorite(currentSong)" :class="getFavoriteIcon(currentSong)"></i>
vue-music 关于搜索历史本地存储的更多相关文章
- [分享]IOS开发-简单实现搜索框显示历史记录的本地缓存及搜索历史每次只能获取到一个的解决方案
		注:原文:http://www.zhimengzhe.com/IOSkaifa/40433.html 1.首先,我们需要对进行过搜索的textField的输入内容进行一个NSUserDefaults的 ... 
- Vue学习之---浏览器本地存储(8/17)
		博客园(纯干货):https://www.cnblogs.com/zheng-yuzhu/ 文章目录 1.基础知识 2.代码实例(localStorage.html) 3.测试效果 4.代码实例(se ... 
- vue-music 关于Search(搜索页面)-- 搜索历史
		搜索历史展示每一次搜索过,并选中的关键字,保存数据到数组.搜索历史数据是需要在多个组件中共享的,所以保存在vuex 中 searchHistory 数组中,保存触发在搜索列表点击选中之后派发事件到se ... 
- JavaScript本地存储实践(html5的localStorage和ie的userData)
		http://www.css88.com/archives/3717 JavaScript本地存储实践(html5的localStorage和ie的userData) 发表于 2011年06月11日 ... 
- 本地存储API
		一.定义 随着互联网的快速发展,基于网页的应用越来越普遍,同时也变得越来越复杂,为了满足各种各样的需求,会经常在本地存储大量的数据,HTML5规范提出了相关解决方案 本地存储设置读取方便,容量较大,s ... 
- HTML5 学习总结(三)——本地存储
		一.HTML4客户端存储 B/S架构的应用大量的信息存储在服务器端,客户端通过请求响应的方式从服务器获得数据,这样集中存储也会给服务器带来相应的压力,有些数据可以直接存储在客户端,传统的Web技术中会 ... 
- Javascript本地存储小结
		前言 总括:详细讲述Cookie,LocalStorge,SesstionStorge的区别和用法. 人生如画,岁月如歌. 原文博客地址:Javascript本地存储小结 知乎专栏&& ... 
- (转)Javascript本地存储小结
		转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 以下是原文: 1. 各种存储方案的简单对比 Cookies:浏览器均支持,容量为4KB UserData:仅 ... 
- HTML5 LocalStorage 本地存储
		HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ... 
随机推荐
- Linux常用网络工具:批量主机服务扫描之netcat
			netcat又叫做瑞士军刀,是黑客和系统管理员常用的网络工具,最初开发的目的是文件传输,后来发展出很多强大的功能,比如也可以完成批量主机服务扫描. 之前介绍了另一个更常用的批量主机服务扫描工具:nma ... 
- [DeeplearningAI笔记]卷积神经网络4.11一维和三维卷积
			4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.11一维和三维卷积 二维和一维卷积 对于2D卷积来说,假设原始图像为\(14*14*3\)的三通 ... 
- gcc和MinGW的异同
			cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ... 
- php实现多继承-trait语法
			自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使开发人员能 ... 
- Ubuntu无法进入图形界面的解决办法
			Ubuntu无法进入图形界面的解决办法 Ubuntu系统启动,输入用户密码后,屏幕显示彩色背景,但是始终不能进入图形界面. 如果你也遇到过这种情况,可以参照以下方法解决(在 ubuntu14.04 验 ... 
- Linux  type命令的用法
			一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法. 1.判断一个名字当前是否是alias.keyword.function.builtin.file或者什么都不是 ... 
- 重构改善既有代码设计--重构手法01:Extract Method (提炼函数)
			背景: 你有一段代码可以被组织在一起并独立出来.将这段代码放进一个独立函数,并让函数名称解释该函数的用途. void PrintOwing(double amount) { PrintBanner() ... 
- 《JavaScript 实战》:实现拖放(Drag & Drop)效果
			拖放效果,也叫拖拽.拖动,学名Drag-and-drop ,是最常见的js特效之一.如果忽略很多细节,实现起来很简单,但往往细节才是难点所在.这个程序的原型是在做图片切割效果的时候做出来的,那时参考了 ... 
- MQTT协议及推送服务
			MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建 ... 
- 阿里iconfont引入方法
			原文:iconfont的引入方法 第一步:使用font-face声明字体@font-face {font-family: 'iconfont';src: url('iconfont.eot'); ... 
