mingyunyuziyou

VUE本地存储 good-storage

作者: 秒速五厘米     
 


VUE实现搜索显示历史搜索记录,采用插件 - 良好的存储

  1. 安装插件

 npm install good-storage -S
  1. 在本地新建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>
        <div  @click="$router.back()">
            <span class="iconfont icon-back-m"></span>
        </div>
        <div :class="isFocus?'':'active'">
            <span v-if="isFocus" class="search-btn iconfont icon-sousuo"></span>
            <input :style="isFocus?'':'text-indent:1.2em;'" v-model="search" @focus="initPage" type="text" placeholder="请输入您要查找的内容"/>
        </div>
        <div v-if="isFocus">
            <span class="iconfont icon-query1" @click="toggleDrawer"></span>
        </div>
        <div v-if="!isFocus">
            <span @click="iptShearch">搜索</span>
        </div>
        <div v-if="!isFocus">
            <h4 v-if="historyxs">搜索历史</h4>
            <ul v-if="historyxs">  
                <li v-for="(item,index) in searches_list" :key="index" @click="historysearch(item)">{{item}}</li>
            </ul> 
            <p v-if="historyxs" @click="clearhis()">清空历史记录</p>   
        </div>
    </div>
</template>

<script>
import {saveSearch} from '../../tools/cache.js'  //引用本地存储js  
import storage from 'good-storage'  //引入good-storage包  
export default {
    data(){
        return{
            search:'',
            isFocus:true,
            searches_list:[], //历史搜索记录列表
            historyxs:false
        }
    },
    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;  
                
            }
            
        },
        //点击搜索
        iptShearch(){
            this.isFocus = true;

            if(this.search!=''){ //搜索框不为空  
                
                saveSearch(this.search); // 本地存储搜索的内容 

                let params = {
                    majorInfo : this.search //零件号或零件名(中英文)或零件类型名称或责任人名称
                }
                this.$emit('handleSearch' , params)

                this.isFocus = true;  
                this.search='';  
            }    

            
        },
        //高级搜索按钮
        toggleDrawer() {
            this.$emit('initSearchPage')
            this.$emit('listenSlide')
        },
        //清空历史记录 
        clearhis(){   
            storage.remove('_search_');  
            this.searches_list = [];
            this.historyxs=false;  
            
        },
        //点击历史搜索把搜索的记录添加到good-storage中 
        historysearch(item){           
            saveSearch(item);  
            this.search = item; 
            this.iptShearch();
            this.historyxs = false;  
        } 
    }
}
</script>


<style scoped>

    .top-box{
        height: $topheight;
        position: fixed;
        top: 0;
        left: 0;
        width: 750px;
        z-index: 778;
        background: $gantanColor;
        .back-box{
        display: block;
        height: 100px;
        padding: 0 30px;
        line-height: 100px;
        position: absolute;
        left: 0;
        top: 0;
        >span{
            font-size:40px;        
            color:$fontcolor;
        }
        }
        .search-box{
            position: absolute;
            width:70%;
            top: 50%;
            left: 50%;
            z-index: 888;
            transform: translate(-50% , -50%);
            &.active{
                width:74%;
                left: 13%;
                transform: translate(0 , -50%);
            }
            height: 64px;
            font-size: 0;
            border:1px solid #fff;
            background-color: #fff;
            border-radius: 35px;
            display: flex;
            flex-direction: row;
            justify-content: flex-start;
            >input{
                display: inline-block;
                width: 90%;
                height: 100%;
                line-height: 64px;
                padding: 0;
                outline: none;
                border:0 none;
                font-size: 24px;
                color:#363636;
                background-color: transparent;
            }
            >span{
                margin: 0 10px 0 18px;
                display: inline-block;
                height: 100%;
                line-height: 64px;
                font-size: 36px;
                color:$titlecolor;
            }
        }
        .slidemenu-btn{
            position: absolute;
            right: 30px;
            top:50%;
            transform: translateY(-50%);
            z-index: 555;
            >span{
                color: $fontcolor;
                font-size: 45px;
                &.text{
                    font-size: 24px;
                }
            }
        }
        .history-panel{
            position: absolute;
            top: 100px;
            left: 0;
            background-color: #fff;
            min-height: 1500px;
            width: 750px;
            overflow: hidden;
            .his_ulcon{
                margin-top: 40px;
                box-sizing: border-box;
                padding: 0 30px;
                display: flex;
                flex-direction: row;
                justify-content: flex-start;
                flex-wrap: wrap;
                >li{
                    padding: 15px 30px;
                    border: 1px solid #999;
                    border-radius: 34px;
                    margin-right: 20px;
                    margin-bottom: 30px;
                    font-size: 28px;
                    color: #363636;
                }
            }
            h4{
                box-sizing: border-box;
                padding: 30px;
                line-height: 80px;
                height: 80px;
                font-size: 30px;
            } 
            >p{
                margin: 30px 0;
                text-align: center;
                line-height: 80px;
                height: 80px;
                font-size: 30px;
            }
        }
    }
   
</style>


注意:引入cache.js时你的文件路径要按照你自己的路径来,一一对应


https://www.jianshu.com/p/20a577a6de00