搜索历史 搜索过的关键词 保存在本地存储 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 关于搜索历史本地存储的更多相关文章

  1. [分享]IOS开发-简单实现搜索框显示历史记录的本地缓存及搜索历史每次只能获取到一个的解决方案

    注:原文:http://www.zhimengzhe.com/IOSkaifa/40433.html 1.首先,我们需要对进行过搜索的textField的输入内容进行一个NSUserDefaults的 ...

  2. Vue学习之---浏览器本地存储(8/17)

    博客园(纯干货):https://www.cnblogs.com/zheng-yuzhu/ 文章目录 1.基础知识 2.代码实例(localStorage.html) 3.测试效果 4.代码实例(se ...

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

    搜索历史展示每一次搜索过,并选中的关键字,保存数据到数组.搜索历史数据是需要在多个组件中共享的,所以保存在vuex 中 searchHistory 数组中,保存触发在搜索列表点击选中之后派发事件到se ...

  4. JavaScript本地存储实践(html5的localStorage和ie的userData)

    http://www.css88.com/archives/3717 JavaScript本地存储实践(html5的localStorage和ie的userData) 发表于 2011年06月11日  ...

  5. 本地存储API

    一.定义 随着互联网的快速发展,基于网页的应用越来越普遍,同时也变得越来越复杂,为了满足各种各样的需求,会经常在本地存储大量的数据,HTML5规范提出了相关解决方案 本地存储设置读取方便,容量较大,s ...

  6. HTML5 学习总结(三)——本地存储

    一.HTML4客户端存储 B/S架构的应用大量的信息存储在服务器端,客户端通过请求响应的方式从服务器获得数据,这样集中存储也会给服务器带来相应的压力,有些数据可以直接存储在客户端,传统的Web技术中会 ...

  7. Javascript本地存储小结

    前言 总括:详细讲述Cookie,LocalStorge,SesstionStorge的区别和用法. 人生如画,岁月如歌. 原文博客地址:Javascript本地存储小结 知乎专栏&& ...

  8. (转)Javascript本地存储小结

    转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 以下是原文: 1. 各种存储方案的简单对比 Cookies:浏览器均支持,容量为4KB UserData:仅 ...

  9. HTML5 LocalStorage 本地存储

    HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ...

随机推荐

  1. 3.redis设计与实现--字典

    1.包括三个结构体:字典结构体+哈希表结构体+哈希节点结构体 2.如何解决哈希冲突? 答:redis使用的是链地址法来解决哈希冲突的,每个链表节点有一个next指针,最新加入的节点会放在链表的头部. ...

  2. 分治法:快速排序求第K极值

    标题其实就是nth_element函数的底层实现 nth_element(first, nth, last, compare) 求[first, last]这个区间中第n大小的元素 如果参数加入了co ...

  3. C++类四个默认函数&深复制&浅复制

    学习C++语言的同学都知道,C++中类是有默认的几个函数的,主要是有四个函数: 四个函数 默认构造函数:A(void),无参构造函数 拷贝(复制)构造函数:A(const A&a).用一个对象 ...

  4. 赶快收藏!16款最流行的 JavaScript 框架

    下面为大家介绍 16款最流行的 JavaScript 框架,赶快收藏! 1. jQuery – Javascript框架 jQuery 是最流行的 JavaScript 框架,它简化了HTML 文档遍 ...

  5. 如何写出高性能SQL语句

    优化SQL查询:如何写出高性能SQL语句 1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生欀如一条SQL语句如果 ...

  6. Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅

    在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...

  7. 天梯赛 L2-012 关于堆的判断 (二叉树)

    将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: "x is the root":x是根结点: "x and y ar ...

  8. Linux命令之uptime

    这是什么 uptime用来查看系统已经启动了多长时间了. 它显示的信息和w命令的头(第一行)是一样一样的. 举个栗子 举一个实际的应用场景: 比如发现服务器上的某些没有加入开机启动的服务挂了一片,这个 ...

  9. spring mvc convention over configuration 之 RequestToViewNameTranslator

    1. RequestToViewNameTranslator简介 在springmvc中很多地方都是约定优于配置的,比如这种写法: @Controller public class IndexActi ...

  10. 49、是否使用过functools中的函数?其作用是什么?

    functools模块介绍 functools用于高阶函数:指那些作用于函数或者返回其他函数的函数.通常情况下,只要是可以被当做函数调用的对象就是这个模块的目标. functools模块的功能 pyt ...