使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)


Posted in Vue.js onJune 09, 2021

最近在开发一款新的app项目,我自己也是第一次接触app开发,经过团队的一段时间研究调查,决定使用Vue3+Vant前端组件的模式进行开发,vue2开发我们已经用过几个项目了,所以决定这一次尝试使用Vue3来进行前段开发。
我刚开始负责搜索功能的开发,有历史搜索记录的需求,一开始我认为这是记录的存储信息也会放在一个数据库表里面,但经过一番调查,发现并不是这样,而是要存储在本地。但是网上的方法也并没有完全解决问题,经过一番尝试,终于给搞好了,话不多说,直接上效果图。
初始化不显示历史搜索记录

使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)

回车搜索进入详情页面

使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)

历史记录页面

使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)

清除历史记录

使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)

首先创建一个js文件
这个js文件主要包括了增加历史记录信息,删除所有历史记录信息的功能

export default {

  // 添加搜索首页历史查询记录
  addSearchHistory(state, payload) {
    // list中包含该记录的时,删除
    const index = state.searchHistoryList.indexOf(payload);
    if (index > -1) {
      state.searchHistoryList.splice(index, 1);
    }
    state.searchHistoryList.unshift(payload);
    // 历史记录中最大记20个记录
    const count = state.searchHistoryList.length;
    state.searchHistoryList.splice(20, count);
  },

  // 清除搜索首页历史查询记录
  clearSearchHistory(state) {
    state.searchHistoryList = [];
  },
};

Vue代码块

<template>
  <!-- 搜索框 -->
  <search-bar
    @searchClick="searchClick"
    :placeholderValue="state.placeholderValue"
    :searchVal="state.searchVal">
  </search-bar>
  <div class="search">

    <!-- 搜索历史 -->
    <div class="history" v-if="state.isShowHistory">
      <span class="proHot">搜索历史</span>
      <span class="delHotSearch" @click="delHostClick">清除历史</span>

      <!-- 存放历史记录信息 -->
      <div class="searchBtn-div">
        <span v-for="(item, index) in state.historyList" :key="index" class="searchValBtn" >
        <van-button
          round
          size="small"
          @click="searchValClick(item)"
          >{{ item }}
        </van-button>
      </span>
      </div>
    </div>
  </div>
</template>

<script>
import {
  onMounted,
  reactive,
  getCurrentInstance,
} from 'vue';
import { Toast, Dialog } from 'vant';
import searchBar from '@/components/SearchBar.vue';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex';

export default {

  components: {
    searchBar,
  },

  setup() {
    const router = useRouter();
    const store = useStore();
    const { proxy } = getCurrentInstance();
    const state = reactive({
      isShowHistory: '', // 是否显示历史记录
      searchVal: '', // 搜索关键字
      placeholderValue: '搜索产品/资讯/标准/成分/企业',
      historyList: [], // 历史搜索数据
    });


    // 回车搜索
    const searchClick = (val) => {
      store.commit('addSearchHistory', val);
      // router.push({ path: '/search-detail', query: { searchVal: val } });
    };

    // 清除历史记录
    const delHostClick = async () => {
      Dialog.confirm({
        message: '确定要删除历史搜索吗?',
      }).then(() => {
        store.commit('clearSearchHistory', store);
        state.isShowHistory = false;
        Toast({
          message: '删除成功',
          position: 'bottom',
        });
      });
    };
	
	// 初始化获取历史搜索记录信息
    onMounted(async () => {
      // 获取历史搜索信息
      state.historyList = store.state.searchHistoryList;
      // 判断初始化是否显示历史搜索
      if (state.historyList.length > 0) {
        state.isShowHistory = true;
      } else {
        state.isShowHistory = false;
      }
    });

    return {
      state,
      searchClick,
      delHostClick,
    };
  },
};
</script>

<style lang="less" scoped>
</style>

Vue代码直接粘贴复制的话可能没法直接用,因为这里面有好多业务代码已经删除,留下的主要是历史搜索记录的代码。主要有三个重点:

引入useStore

import { useStore } from 'vuex';

const store = useStore();

初始化检索历史搜索记录

// 初始化获取历史搜索记录信息
	// 每次加载这和页面都会首先调用这个方法,来取最新的信息
    onMounted(async () => {
      // 获取历史搜索信息
      state.historyList = store.state.searchHistoryList;
      // 判断初始化是否显示历史搜索
      if (state.historyList.length > 0) {
        state.isShowHistory = true;
      } else {
        state.isShowHistory = false;
      }
    })

搜索框触发搜索事件将搜索信息存放在Store中

// 子组件发射一个事件,父组件调用
    const searchClick = (val) => {
    	// 将搜索值放入历史记录中	
      store.commit('addSearchHistory', val);
      // 路由跳转可以忽略
      // router.push({ path: '/search-detail', query: { searchVal: val } });
    };

清空历史记录

// 清除历史记录
    const delHostClick = async () => {
      Dialog.confirm({
        message: '确定要删除历史搜索吗?',
      }).then(() => {
      	// 清空历史记录信息
        store.commit('clearSearchHistory', store);
        state.isShowHistory = false;
        Toast({
          message: '删除成功',
          position: 'bottom',
        });
      });
    };

以上就是使用Vue3+Vant组件实现App搜索历史记录功能的详细内容,更多关于vue 搜索历史记录的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
Vue+element-ui添加自定义右键菜单的方法示例
Dec 08 Vue.js
vue使用element-ui实现表单验证
Dec 13 Vue.js
vue3.0实现插件封装
Dec 14 Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
vue-video-player 断点续播的实现
Feb 01 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
如何理解Vue简单状态管理之store模式
May 15 Vue.js
详解vue中v-for的key唯一性
May 15 Vue.js
vue-element-admin项目导入和导出的实现
May 21 Vue.js
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
vue项目如何打包之项目打包优化(让打包的js文件变小)
Apr 30 Vue.js
vue中data里面的数据相互使用方式
Jun 05 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 #Vue.js
Vue中插槽slot的使用方法与应用场景详析
vue+elementui 实现新增和修改共用一个弹框的完整代码
解决vue $http的get和post请求跨域问题
vue Element-ui表格实现树形结构表格
Jun 07 #Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 #Vue.js
vue响应式原理与双向数据的深入解析
You might like
用PHP开发GUI
2006/10/09 PHP
php开启openssl的方法
2014/05/15 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
Python request设置HTTPS代理代码解析
2018/02/12 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
运动会广播稿400字
2014/01/25 职场文书
股份合作协议书范本
2014/04/14 职场文书
促销活动总结报告
2014/04/26 职场文书
项目投资合作意向书
2014/07/29 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
工作失职检讨书范文
2015/05/05 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书