前端Vue自定义带历史记录的搜索框组件searchBar 支持搜索输入框清空 搜索历史存储记录清除,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13343

效果图如下:

cc-hisSearchBar

使用方法


// 不同的业务功能历史记录设置不同存储key const kStorageKey = "storageKey" // 执行搜索事件 doSearch() { if (this.keyword == '') { uni.showToast({ title: '请输入要搜索的内容', icon: 'none' }); return; } // if (this.keyword && this.keyword !== '') { this.saveKeyword(this.keyword); //保存为历史 } uni.showLoading({ title: '搜索中...' }); this.setData({ keywordList: [] }); uni.hideLoading() uni.showModal({ title: "温馨提示", content: '搜索的内容 = ' + this.keyword }) }, //点击历史记录搜索 doHisSearch(item) { console.log(item) uni.showModal({ title: '点击的历史搜索条目', content: '点击的历史搜索条目 = ' + item }) },

HTML代码实现部分


<template> <view class="content"> <view class="search-box"> <view class="input-box"> <input type="text" adjust-position="true" v-model="keyword" :placeholder="defaultKeyword" placeholder-class="search_text" @confirm="doSearch" data-key="false" confirm-type="search" @input="onclear"></input> <image src="/static/close.png" @tap="clears" v-if="shows == true"></image> </view> <view class="search-btn" @tap="doSearch" data-key="false" :style="'background:' + colors">搜索</view> </view> <view class="search-keyword"> <scroll-view class="keyword-box" scroll-y> <view class="keyword-block" v-if="oldKeywordList.length>0"> <view class="keyword-list-header"> <view>历史搜索</view> <view> <image @tap="oldDelete" src="/static/delete.png"></image> </view> </view> <view class="keyword"> <view v-for="(item, index) in oldKeywordList" :key="index" @tap="doHisSearch(item)">{{item}} </view> </view> </view> </scroll-view> </view> </view> </template> <script> // 不同的业务功能历史记录设置不同存储key const kStorageKey = "storageKey" import Vue from 'vue' Vue.mixin({ methods: { setData: function(obj, callback) { let that = this; const handleData = (tepData, tepKey, afterKey) => { tepKey = tepKey.split('.'); tepKey.forEach(item => { if (tepData[item] === null || tepData[item] === undefined) { let reg = /^[0-9]+$/; tepData[item] = reg.test(afterKey) ? [] : {}; tepData = tepData[item]; } else { tepData = tepData[item]; } }); return tepData; }; const isFn = function(value) { return typeof value == 'function' || false; }; Object.keys(obj).forEach(function(key) { let val = obj[key]; key = key.replace(/\]/g, '').replace(/\[/g, '.'); let front, after; let index_after = key.lastIndexOf('.'); if (index_after != -1) { after = key.slice(index_after + 1); front = handleData(that, key.slice(0, index_after), after); } else { after = key; front = that; } if (front.$data && front.$data[after] === undefined) { Object.defineProperty(front, after, { get() { return front.$data[after]; }, set(newValue) { front.$data[after] = newValue; that.$forceUpdate(); }, enumerable: true, configurable: true }); front[after] = val; } else { that.$set(front, after, val); } }); isFn(callback) && this.$nextTick(callback); } } }); var app = getApp(); export default { data() { return { defaultKeyword: "", keyword: "", oldKeywordList: [], hotKeywordList: [], keywordList: [], forbid: '', shows: false, colors: '' }; }, components: {}, props: {}, /** * 生命周期函数--监听页面加载 */ onLoad: function(options) { this.setData({ colors: app.globalData.newColor }); this.init(); }, methods: { init() { this.loadDefaultKeyword(); this.loadOldKeyword(); }, loadDefaultKeyword() { //定义默认搜索关键字,可以自己实现ajax请求数据再赋值,用户未输入时,以水印方式显示在输入框,直接不输入内容搜索会搜索默认关键字 this.setData({ defaultKeyword: "请输入搜索的内容" }); }, //加载历史搜索,自动读取本地Storage loadOldKeyword() { uni.getStorage({ key: kStorageKey, success: res => { var OldKeys = JSON.parse(res.data); this.setData({ oldKeywordList: OldKeys }); } }); }, // 执行搜索事件 doSearch() { if (this.keyword == '') { uni.showToast({ title: '请输入要搜索的内容', icon: 'none' }); return; } // if (this.keyword && this.keyword !== '') { this.saveKeyword(this.keyword); //保存为历史 } uni.showLoading({ title: '搜索中...' }); this.setData({ keywordList: [] }); uni.hideLoading() uni.showModal({ title: "温馨提示", content: '搜索的内容 = ' + this.keyword }) // uni.showToast({ // title: '暂无结果', // icon: 'none' // }) }, onclear(e) { this.setData({ keyword: e.detail.value, shows: e.detail.value !== '' ? true : false }); }, //保存关键字到历史记录 saveKeyword(keyword) { uni.getStorage({ key: kStorageKey, success: res => { var OldKeys = JSON.parse(res.data); var findIndex = OldKeys.indexOf(keyword); if (findIndex == -1) { OldKeys.unshift(keyword); } else { OldKeys.splice(findIndex, 1); OldKeys.unshift(keyword); } //最多10个纪录 OldKeys.length > 10 && OldKeys.pop(); uni.setStorage({ key: kStorageKey, data: JSON.stringify(OldKeys) }); this.setData({ oldKeywordList: OldKeys //更新历史搜索 }); }, fail: e => { var OldKeys = [keyword]; uni.setStorage({ key: kStorageKey, data: JSON.stringify(OldKeys) }); this.setData({ oldKeywordList: OldKeys //更新历史搜索 }); } }); }, oldDelete() { uni.showModal({ content: '确定清除历史搜索记录?', success: res => { if (res.confirm) { console.log('用户点击确定'); this.setData({ oldKeywordList: [] }); uni.removeStorage({ key: kStorageKey }); } else if (res.cancel) { console.log('用户点击取消'); } } }); }, clears() { this.setData({ keyword: '', keywordList: [], }); }, //点击历史记录搜索 doHisSearch(item) { console.log(item) uni.showModal({ title: '点击的历史搜索条目', content: '点击的历史搜索条目 = ' + item }) }, } }; </script> <style scoped lang="scss"> view { display: block; } .search-box { background-color: rgb(242, 242, 242); padding: 15upx 2.5%; display: flex; justify-content: space-between; position: sticky; top: 0; } .search-box .mSearch-input-box { width: 100%; } .search-box .input-box { width: 85%; flex-shrink: 1; display: flex; justify-content: center; align-items: center; } .search-box .search-btn { width: 15%; margin: 0 0 0 2%; display: flex; justify-content: center; align-items: center; flex-shrink: 0; font-size: 24upx; color: #fff; background: linear-gradient(to right, #4492EB, #3F92EE); border-radius: 60upx; } .search-box .input-box>input { width: 95%; height: 60upx; font-size: 24upx; -webkit-appearance: none; -moz-appearance: none; appearance: none; margin: 0; background-color: #ffffff; } .placeholder-class { color: #9e9e9e; } .search-keyword { width: 100%; background-color: rgb(242, 242, 242); } .keyword-list-box { height: calc(100vh - 110upx); padding-top: 10upx; border-radius: 20upx 20upx 0 0; background-color: #fff; } .keyword-entry-tap { background-color: #eee; } .keyword-entry { width: 94%; height: 80upx; margin: 0 3%; font-size: 30upx; color: #333; display: flex; justify-content: space-between; align-items: center; border-bottom: solid 1upx #e7e7e7; } .keyword-entry image { width: 60upx; height: 60upx; } .keyword-entry .keyword-text, .keyword-entry .keyword-img { height: 80upx; display: flex; align-items: center; } .keyword-entry .keyword-text { width: 90%; } .keyword-entry .keyword-img { width: 10%; justify-content: center; } .keyword-box { height: calc(100vh - 110upx); border-radius: 20upx 20upx 0 0; background-color: #fff; } .keyword-box .keyword-block { padding: 10upx 0; } .keyword-box .keyword-block .keyword-list-header { width: 94%; padding: 10upx 3%; font-size: 27upx; color: #333; display: flex; justify-content: space-between; } .keyword-box .keyword-block .keyword-list-header image { width: 40upx; height: 40upx; } .keyword-box .keyword-block .keyword { width: 94%; padding: 3px 3%; display: flex; flex-flow: wrap; justify-content: flex-start; } .keyword-box .keyword-block .hide-hot-tis { display: flex; justify-content: center; font-size: 28upx; color: #6b6b6b; } .keyword-box .keyword-block .keyword>view { display: flex; justify-content: center; align-items: center; border-radius: 38upx; padding: 0 20upx; margin: 10upx 20upx 10upx 0; height: 60upx; font-size: 24upx; background-color: rgb(242, 242, 242); color: #6b6b6b; line-height: 60upx; } .search_text { font-size: 24upx; color: #B6B6C6; } .input-box { position: relative; height: 60upx; font-size: 24upx; border: 0; border-radius: 60upx; -webkit-appearance: none; appearance: none; padding: 0 3%; margin: 0; background-color: #ffffff; } .input-box image { height: 40upx; width: 40upx; float: right; position: absolute; right: 2%; top: 50%; transform: translateY(-50%); z-index: 100; } </style>

前端Vue自定义带历史记录的搜索框组件searchBar 支持搜索输入框清空 搜索历史存储记录清除的更多相关文章

  1. vue自定义可输入的选择框组件

    vue自定义可输入的选择框组件 props: 属性 说明 类型 默认值 selectDataList 下拉框中的内容 Array 空数组([]) value 输入框中的内容 String 空字符串(& ...

  2. Android零基础入门第62节:搜索框组件SearchView

    原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当 ...

  3. 第二百一十节,jQuery EasyUI,SearchBox(搜索框)组件

    jQuery EasyUI,SearchBox(搜索框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 SearchBox(搜索框)组件的使用方法,这个组 ...

  4. SearchBox( 搜索框) 组件

    一. 加载方式//class 加载方式<input id="ss" class="easyui-searchbox" style="width: ...

  5. jQuery实现搜索框插件+豆瓣音乐接口实现豆瓣搜索框

    jQuery实现搜索框插件 豆瓣音乐接口实现豆瓣搜索框 豆瓣接口有时不稳定,网络请求会报400,不要惊慌.我主要是练习一下jQuery的JSONP和封装插件. <div class=" ...

  6. Nuxt/Vue自定义导航栏Topbar+标签栏Tabbar组件

    基于Vue.js实现自定义Topbar+Tabbar组件|仿咸鱼底部凸起导航 最近一直在倒腾Nuxt项目,由于Nuxt.js是基于Vue.js的服务端渲染框架,只要是会vue,基本能很快上手了. 一般 ...

  7. Qt QLineEdit 漂亮的搜索框 && 密码模式 && 格式化输入 && 提示文字 && 选择内容并移动 && 清除全部输入

    先上一个漂亮的搜索框效果图, 输入搜索文本效果, 点击搜索图标效果: //实现代码 void MainWindow::iniLineEdit() { ui->lineEdit->setPl ...

  8. 关于隐式创建vue实例实现简化弹出框组件显示步骤

    我们在使用vue写alert组件的时候,经常是定义了一个alert.vue,然后引入alert.vue,然后配置参数等等,非常繁琐,那有没有一种方式可以像window.alert("内容&q ...

  9. Flex AIR自定义Mobile的弹出框组件

    做Flex Mobile开发的人应该知道,Flex为手机应用并没有提供弹出框组件,需要自定义. 通过查找文档.资料,我做出一个效果还算不错的弹出框组件,可以适用于手机设备上,不多讲,直接贴源码,相信对 ...

  10. WeChat-SmallProgram:自定义select下拉选项框组件

    1):创建组件所需的文件 2):自定义组件 CSS 及 JS 组件的wxml: <view class='com-selectBox'> <view class='com-sCont ...

随机推荐

  1. abc285G

    ABC 285 G - Tatami Solution 网络流 网格图是一个天然二分图, 可以按 横纵坐标之和 的奇偶性将相邻两格分属于左部和右部. 记'?' 或 '2' 的格子为待匹配点, 记横纵坐 ...

  2. 1.封装PageHelper实现分页

    前言 这几天想着动手将一些技术融合到项目中,昨天思考了会儿,想起了我与亲戚的对话:我说:"我想将若依项目完整的实现一遍",亲戚给我反馈到"你没必要完整复现若依项目,而且你 ...

  3. 五月八号java基础知识点

    1.对于容器中元素进行访问时,经常需要按照某种次序对容器中的每个元素访问且仅访问 一次,这就是遍历,也称为迭代.2.遍历是指从容器中获得当前元素的后续元素.对元素的遍历有很多种:第一种就是foreac ...

  4. 用 Go 剑指 Offer 12. 矩阵中的路径

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内的字母 ...

  5. Redis 日志showlog 和 管道pileline

    redis日志 slowlog-log-slower-than:指定执行时间超过多少微秒(1秒等于1000000微秒) 的命令请求会被记录到日志上 slowlog-max-len:指定服务器最多保存多 ...

  6. 最好用的.NET敏捷开发框架-RDIFramework.NET V3.6版全新发布 100%源码授权

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...

  7. FFmpeg开发笔记(一)搭建Linux系统的开发环境

    对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库.不过考虑到刚开始仅仅调用 ...

  8. OpenHarmony SystemUI开发记录

    背景介绍 最近学习OpenHarmony应用开发, SDK版本是3.2.9.2 Beta4,IDE版本是3.1.0.200.参考官方文档,做了个Demo应用,调试.运行非常顺利.启动应用后,状态栏和导 ...

  9. Nuxt3环境变量配置

    Nuxt3 正式发布还不到半年,在投入生产环境使用后,遇到了不少问题,很难找到合适的解决方案,其中环境变量配置就是其中一个,之前一直未能解决,最近要上持续集成,无法绕过这个问题,所以花了点时间研究了一 ...

  10. 响应式的 switchboard:让又大又慢的Vue/AIpine 页面爆快

    我的提示: AIpine 是一个js 库,官网口号是 "一个新的轻量极javascript框架",其实我之前也没接触过,翻译这篇文章时才注意到 官方地址: [AIpine.js]h ...