您好,登錄后才能下訂單哦!
這篇文章主要介紹了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具體輕量級框架、簡單易學、雙向數據綁定、組件化、數據和結構的分離、虛擬DOM、運行速度快等優勢,Vue中頁面使用的是局部刷新,不用每次跳轉頁面都要請求所有數據和dom,可以大大提升訪問速度和用戶體驗。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Vue如何實現輸入框新增搜索歷史記錄功能”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。