Vue 实现输入框新增搜索历史记录功能


Posted in Javascript onOctober 15, 2019

Vue 实现输入框新增搜索历史记录功能

vue实现搜索显示历史搜索记录,采用插件-good-storage

安装插件

     npm install good-storage -S

在本地新建cache.js文件,该文件是关于本地存储的逻辑处理(缓存到本地的数据最大缓存15条,并且新的插入在第一位,首先得到当前的存储数据情况,将关键字存到数组中,判断如果数组中有相同的数据,则把重复的数据删除,将新的关键字存入到前面)

cache.js 文件中的代码如下

/*把搜索的结果保存下来*/ 
/*用export把方法暴露出来*/ 
/*定义存储搜索的key _search_定义内部使用的key*/ 
const SEARCH_KEY='_search_' 
const SEARCH_MAX_LENGTH=15 
/*插入方法   arr存储的数据 val传入存储的值 compare前后比较的函数 maxlen存入的最大值*/ 
function insertArray(arr,val,compare,maxlen){ 
  //findIndex()函数也是查找目标元素,找到就返回元素的位置,找不到就返回-1。 
  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() //方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值 
     
  } 
} 
//开源storage的库,对localstorage和sessionstorage的封装 
import storage from 'good-storage' 
export function saveSearch(query){ 
  let searches=storage.get(SEARCH_KEY,[]) 
  /*逻辑是最后一次搜索的结果放到搜索历史的第一个*/ 
  insertArray(searches,query,(item)=>{    
    return item===query //这是传入的一个比较函数 说明query在这个数组中 
  },SEARCH_MAX_LENGTH) 
  storage.set(SEARCH_KEY,searches) 
  return searches 
}

在对应的组件中应用的方式:

<template>
 <div class="search">
  <!-- 顶部搜索栏 -->
  <div class="header">
   <div class="head-title title-style">输入关键字</div>
   <div class="head-input">
    <input
     type="text"
     ref="inputchange"
     v-model="valuetext"
     @keyup.enter="onSearch(true)"
     @keyup.tab="onSearch(true)"
     @focus="initPage"
     placeholder="请输入关键字进行搜索"
    />
    <div type="text" @click="clear" class="input-btn title-style">清除</div>
   </div>

   <div class="history-panel" v-if="!isFocus">
    <div v-if="historyxs">搜索历史</div>
    <div v-if="searches_list.length>0">
     <ul class="his_ulcon" v-if="historyxs">
      <li
       v-for="(item,index) in searches_list"
       :key="index"
       @click="historysearch(item)"
      >{{item}}</li>
     </ul>
    </div>
    <div class="history-tips" v-else>暂无搜索记录!</div>
    <p v-if="historyxs" @click="clearhis">清空历史记录</p>
   </div>
  </div>
  <!-- ... 此处省略无关代码 -->

  <!-- 底部按钮 -->
  <div class="footer title-style">
   <van-row>
    <van-col span="12">
     <div class="left" @click="resetData">重置所选条件</div>
    </van-col>
    <van-col span="12">
     <div class="right" @click="onSearch(true)">立即搜索</div>
    </van-col>
   </van-row>
  </div>
 </div>
</template>

<script type="text/Babel">
import { saveSearch } from "../../utils/cache"; //引用本地存储js
import storage from "good-storage"; //引入good-storage包
export default {
 data() {
  return {
   isFocus: true,
   searches_list: [], //历史搜索记录列表
   historyxs: false,
   valuetext: ""
  };
 },
 mounted() {},
 methods: {
  //输入框获取焦点
  initPage() {
   this.isFocus = false;
   this.$emit("initSearchPage");
   //为避免重复先清空再添加
   this.searches_list = [];
   let searches = storage.get("_search_");
   this.searches_list = searches ? searches : [];
   if (this.searches_list.length > 0) {
    this.historyxs = true;
   } else {
    this.historyxs = false;
   }
  },
  //清空历史记录
  clearhis() {
   storage.remove("_search_");
   this.searches_list = [];
   this.historyxs = false;
  },
  //点击历史搜索把搜索的记录添加到good-storage中
  historysearch(item) {
   saveSearch(item);
   this.valuetext = item;
   this.historyxs = false;
  },
  resetData() {
   // ...
   //  此次省略重置数据的逻辑代码
  },
  onSearch(isFirst) {
   this.isFocus = true;
   if (this.valuetext != "") {
    //搜索框不为空
    saveSearch(this.valuetext); // 本地存储搜索的内容
    let params = {
     majorInfo: this.valuetext //流程类型或者流程名称
    };
    this.$emit("handleSearch", params);
    this.isFocus = true;
   }
   // ...
   // 此次省略调用搜索接口的代码
  },
  clear() {
   this.valuetext = "";
  }
  // ... 无关代码已省略
 }
};
</script>

<style lang="less" rel="stylesheet/less" type="text/less" scoped>
.search {
 overflow-y: scroll;
 overflow-x: hidden;
 padding: 0.14rem 0.12rem 0.53rem;
 .header {
  border-bottom: 0.01rem solid #f2f2f2;
  .head-title {
   padding-bottom: 0.05rem;
   color: #666666;
  }
  .head-input {
   width: 100%;
   padding-bottom: 0.1rem;
   display: flex;
   flex-direction: row;
   justify-content: space-between;

   > input {
    height: 0.29rem;
    width: 2.84rem;
    border-radius: 0.03rem;
    background-color: #f6f6f6;
    font-family: PingFang-SC-Regular;
    font-weight: Regular;
    color: #999999;
    font-size: 0.12rem;
    padding-left: 0.12rem;
   }
   .input-btn {
    color: #029ffb;
    width: 0.5rem;
    height: 0.29rem;
    line-height: 0.29rem;
    text-align: center;
   }
  }
  .history-panel {
   width: 100%;
   overflow: hidden;
   padding: 0.1rem 0;
   border-top: 1px solid #f2f2f2;
   .his_ulcon {
    margin-top: 0.1rem;
    box-sizing: border-box;
    display: flex;
    flex-direction: row;
    justify-content: flex-start;
    flex-wrap: wrap;
    > li {
     border: 1px solid #f2f2f2;
     border-radius: 0.03rem;
     display: inline-block;
     font-size: 0.12rem;
     padding: 0 0.15rem;
     width: fit-content; //div宽度自适应文字内容
     width: -webkit-fit-content;
     width: -moz-fit-content;
     height: 0.29rem;
     line-height: 0.29rem;
     text-align: center;
     margin-right: 0.1rem;
     background-color: #f2f2f2;
     margin-bottom: 0.1rem;
    }
   }
   div {
    box-sizing: border-box;
    font-size: 0.13rem;
    color: #666666;
    font-weight: Medium;
    font-family: PingFang-SC-Medium;
   }
   > p {
    text-align: center;
    margin-top: 0.1rem;
    font-size: 0.13rem;
   }
  }
  .history-tips {
   text-align: center;
  }
 }
 .title-style {
  font-size: 0.13rem;
  font-weight: Medium;
  font-family: PingFang-SC-Medium;
 }
}
</style>

温馨提示:引入cache.js时你的文件路径要按照你自己的路径来 一 一对应

总结

以上所述是小编给大家介绍的Vue 实现输入框新增搜索历史记录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
获取select元素被选中的文本内容的js代码
Jan 29 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 Javascript
javascript获取文档坐标和视口坐标
May 26 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
Mar 25 Javascript
bootstrap的工具提示实例代码
May 17 Javascript
详解Vue-Cli 异步加载数据的一些注意点
Aug 12 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 Javascript
postman自定义函数实现 时间函数的思路详解
Apr 17 Javascript
Bootstrap实现模态框效果
Sep 30 Javascript
JavaScript实现缓动动画
Nov 25 Javascript
原生js实现移动小球(碰撞检测)
Dec 17 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
Centos7 安装Node.js10以上版本的方法步骤
Oct 15 #Javascript
微信小程序如何实现五星评价功能
Oct 15 #Javascript
node.js express框架实现文件上传与下载功能实例详解
Oct 15 #Javascript
ES6 Promise对象概念及用法实例详解
Oct 15 #Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
Oct 15 #Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
Oct 15 #Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
Oct 15 #Javascript
You might like
默默小谈PHP&amp;MYSQL分页原理及实现
2007/01/02 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
prototype 学习笔记整理
2009/07/17 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
vue $set 给数据赋值的实例
2019/11/09 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
介绍Python中的文档测试模块
2015/04/28 Python
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
django初始化数据库的实例
2018/05/27 Python
python3.6数独问题的解决
2019/01/21 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
Python 画出来六维图
2019/07/26 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
Pytorch之contiguous的用法
2019/12/31 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
《彩色世界》教学反思
2014/04/12 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL