vue 历史搜索记录读取新增删除

1 案例说明

​ 实现搜索历史展示、搜索内容跳转、搜索历史清空,限制搜索历史展示数目,历史记录存储于本地 localStorage

2 案例演示
search.gif
2 源码

​ 本项目 github 源码:https://github.com/trp1119/vue-small-case

<template>
  <div id="app">
    <div class="search-area">
      <div class="search">
        <input v-model="input" type="text" placeholder="请输入搜索内容">
      <button @click="handleSearchResult(input)">搜索</button>
      </div>
      <div class="content">
        <span>搜索历史</span>
        <span class="cancel" @click="clearHistory">清空</span>
      </div>
      <div class="history">
        <span class="norecord" v-if="historyList.length == 0">暂时搜索记录</span>
        <span
          class="record"
          v-else
          v-for="(historyItem, index) in historyList"
          :key="index"
          @click="handleSearchResult(historyItem)"
        >
          {{historyItem}}
        </span>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'app',
  data () {
    return {
      input: '',
      historyList: []
    }
  },
  mounted () {
    if (localStorage.getItem('localHistory') !== null) {
      this.historyList = localStorage.getItem('localHistory').split('|')
    }
  },
  methods: {
    /**
     * 执行搜索
     */
    handleSearchResult (val) {
      if (val === '') {
        alert('请输入搜索内容!')
        return
      }
      this.setlocalHistory(val) // 将搜索值加入本地localStorage
      this.historyList = localStorage.getItem('localHistory').split('|') // 从本地localStorage取出搜索历史并展示
      this.input = '' // 清空输入框
      // alert(`跳转至 ${val} 搜索结果页`) // 跳转至搜索结果页
    },
    /**
     * 加入历史搜索记录
     */
    setlocalHistory (val) {
      val = val.trim()
      let localHistory = localStorage.getItem('localHistory')
      if (localHistory === null) {
        localStorage.setItem('localHistory', val) // 若未设置过则直接设置本地存储
      }else {
        let localHistoryArray = localHistory.split('|').filter(item => item != val) // 删除搜索历史中与本次输出重复项
        if (localHistoryArray.length > 0) {
          localHistory = val + '|' + localHistoryArray.join('|') // 新增记录
        }
        if (localHistory.split('|').length > 10) { // 最大历史搜索记录10条
          localHistoryArray = localHistory.split('|')
          localHistoryArray.pop() // 删除最旧一项
          localHistory = localHistoryArray.join('|')
        }
        localStorage.setItem('localHistory', localHistory) // 存入本地
      }
    },
    /**
     * 清空历史搜索记录
     */
    clearHistory () {
      localStorage.removeItem('localHistory') // 清空搜索历史
      this.historyList = []
    }
  }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* text-align: center; */
  color: #2c3e50;
  margin-top: 60px;
}
.search-area {
  width: 230px;
  height: 120px;
  border: 1px solid #ccc;
  padding: 20px;
}
.content {
  width: 225px;
  font-size: 12px;
  margin-top: 10px;
}
.content .cancel {
  float: right;
  color: #1F8CEB;
  cursor: pointer;
}
.search button {
  margin-left: 10px;
}
.history {
  margin-top: 10px;
}
.history .norecord {
  font-size: 12px;
  color: #aaa;
  margin-left: 80px;
}
.history .record {
  display: inline-block;
  padding: 3px 10px;
  border-radius: 5px;
  background-color: #f6f6f6;
  font-size: 12px;
  color: #333;
  margin-right: 10px;
  margin-top: 5px;
  cursor: pointer;
}
</style>
3 使用API
3.1 localStorage API
3.1.1 setItem 保存数据
localStorage.setItem("key", "value");
3.1.2 getItem 读取数据
let localHistory = localStorage.getItem("key");
3.1.3 removeItem 删除数据:
localStorage.removeItem("key");
3.2 String API
3.2.1 String.prototype.split()

split() 方法使用指定的分隔符字符串将一个 String 对象分割成子字符串数组。

let str = "衣服|鞋子|裤子"
let arr = str.split("|")
console.log(arr) // ["衣服","鞋子","裤子"]
3.3 Array API
3.3.1 Array.prototype.filter()

filter() 方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。

filter 不会改变原数组,它返回通过 filter()callback 过滤后的新数组。如果没有任何数组元素通过测试,则返回空数组。

// 参数 index 为当前处理项,index 为当前处理项的索引, arr 为当前处理数组
let str = "裤子"
let array = ["衣服","鞋子","裤子"]
let newArr = array.filter((item, index, arr) => {
    item !== str // 返回数组中 >3 的值组成的新数组
})
console.log(newArr) // ["衣服","鞋子"]
3.3.2 Array.prototype.join()

join() 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。

返回值为一个所有数组元素连接的字符串。如果 arr.length0,则返回空字符串。

如果一个元素为 undefinednull,它会被转换为空字符串。

let array = ["衣服","鞋子","裤子"]
let str = array.join('|') // 使用 | 分隔数组中的每个元素,若缺省则用“,”分隔,若是空字符串''则没有分隔符
console.log(str) // "衣服|鞋子|裤子"
3.3.3 Array.prototype.pop()

pop()方法从数组中删除最后一个元素,并返回所删除元素的值,并改变原数组。当数组为空时返回 undefined

let array = ["衣服","鞋子","裤子"]
let str = array.pop()
console.log(str) // 裤子
console.log(array) // ["衣服","鞋子"]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342