vue-music 关于Search(搜索页面)-- 搜索历史

搜索历史展示每一次搜索过,并选中的关键字,保存数据到数组。搜索历史数据是需要在多个组件中共享的,所以保存在vuex 中 searchHistory 数组中,保存触发在搜索列表点击选中之后派发事件到search.vue 中,search.vue 监听事件并提交actions改变共享数组,改变vuex 中共享数据之前需要存到本地缓存 Localstorage 中,在本地存储 中判断如果当期历史搜索数据在数据中已经有则提前插入到第一位,没有则添加到数组中存储

在common 中 创建cache.js 里面写所有相关存储的逻辑代码。使用goog-storage 库 方便调用localstorage 相关api

保存本地搜索历史首先获取访问本地存储中的key 如果已经有值则赋值,没有则赋值为空数组,插入新数据前先与当前历史数据列表比较有没有相同数据,有则且在第一个位置原样返回该数据,有且大于第一个位置则删除该数据,然后再插入,并且插入大于最大限制条数的时候,删除数组的最后一个元素。最后调用storage.set(key,val) 存到本地缓存中。并且 在action 中提交到vuex数据中

cache.js

import storage from ‘good-storage‘

const SEARCH_KEY = ‘__search__‘
const SEARCH_MAX_LEN = 15

// 检索函数,判断新增的是否存在
function insertArray(arr, val, compare, maxLen) {
  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()
  }
}

export function saveSearch(query) {
  let searches = storage.get(SEARCH_KEY, [])
  insertArray(searches, query, (item) => {
    return item === query
  }, SEARCH_MAX_LEN)
  storage.set(SEARCH_KEY, searches)
  return searches
}
  export function loadSearch() {    return storage.get(SEARCH_KEY, [])  }

actions.js

export const saveSearchHistory = function({commit},query){
  commit(types.SET_SEARCH_HISTORY,saveSearch(query));
} 

state.js

import {loadSearch} from ‘common/js/cache.js‘;

const state = {
    singer:{},
    playing:false,
    fullScreen:false,
    playList:[],
    sequenceList:[],
    mode:playMode.sequence,
    currentIndex:-1,
    disc:{},
    topList:{},
    searchHistory:loadSearch()    //默认值从本地存储中获取
}
export default state

将获取来的vuex数据遍历到历史数据列表组件上search-list 组件

<template>
  <div class="search-list" v-show="searches.length">
    <ul>
      <li :key="item" class="search-item" @click="selectItem(item)" v-for="item in searches">
        <span class="text">{{item}}</span>
        <span class="icon" @click.stop="deleteOne(item)">
          <i class="icon-delete"></i>
        </span>
      </li>
    </ul>
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    props: {
      searches: {
        type: Array,
        default: []
      }
    },
    methods: {
      selectItem(item) {
        this.$emit(‘select‘, item)
      },
      deleteOne(item) {
        this.$emit(‘delete‘, item)
      }
    }
  }
</script>

组件上派发一个选中本条历史数据和删除本条历史数据的方法,选中本条可以引用addQuery 方法将本条数据再次填在input 搜索框中。删除本条调用action 方法

function deleteFromArray(arr, compare) {
  const index = arr.findIndex(compare)
  if (index > -1) {
    arr.splice(index, 1)
  }
}

// 删除后的数组存到本地
export function deleteSearch(query) {
  let searches = storage.get(SEARCH_KEY, [])
  deleteFromArray(searches, (item) => {
    return item === query
  })
  storage.set(SEARCH_KEY, searches)
  return searches
}

------------------ actions.js -----

export const deleteSearchHistory = function({commit},query){
  commit(types.SET_SEARCH_HISTORY,deleteSearch(query));
}

点击清除所有历史数据方法和删除本条的逻辑一样,需要提交actions 清除本地缓存数据,并返回一个空数组赋值给vuex 数据,然后组件通过mapActions 调用该方法清空历史数据

// 清除数据
export function clearSearch() {
  storage.remove(SEARCH_KEY)
  return []
}

// 提交空数组
export const clearSearchHistory = function({commit}){
  commit(types.SET_SEARCH_HISTORY,clearSearch());
}

search.vue 引入mapActions ,代理调用clearSearchHistory 方法

import {mapActions,mapGetters} from ‘vuex‘

...mapActions([
  ‘saveSearchHistory‘,
  ‘deleteSearchHistory‘,
  ‘clearSearchHistory‘
])

// 绑定派发事件   
deleteAll(){
  this.clearSearchHistory();
},

//!注意这里可以直接将代理的方法直接绑定到监听事件中,可省略再次写方法名

// 之前是
<span class="clear" @click="deleteAll">

// 可改为
<span class="clear" @click="clearSearchHistory">

优化体验,点击清空所以数据的时候弹窗确认删除才删除

建立confirm 组件,向外派发点击确认按钮时的事件,这里就直接把确认的派发事件写成 clearSearchHistory 。取消的话影藏自身就行

// confirm 组件<template>
  <transition name="confirm-fade">
    <div class="confirm" v-show="showFlag" @click.stop>
      <div class="confirm-wrapper">
        <div class="confirm-content">
          <p class="text">{{text}}</p>
          <div class="operate">
            <div @click="cancel" class="operate-btn left">{{cancelBtnText}}</div>
            <div @click="confirm" class="operate-btn">{{confirmBtnText}}</div>
          </div>
        </div>
      </div>
    </div>
  </transition>
</template>

<script type="text/ecmascript-6">
  export default {
    props: {
      text: {
        type: String,
        default: ‘‘
      },
      confirmBtnText: {
        type: String,
        default: ‘确定‘
      },
      cancelBtnText: {
        type: String,
        default: ‘取消‘
      }
    },
    data() {
      return {
        showFlag: false    // 内部变量控制其显示影藏
      }
    },
    methods: {
      show() {
        this.showFlag = true
      },
      hide() {
        this.showFlag = false
      },
      cancel() {
        this.hide()
        this.$emit(‘cancel‘)
      },
      confirm() {
        this.hide()
        this.$emit(‘confirm‘)
      }
    }
  }
</script>

原文地址:https://www.cnblogs.com/catbrother/p/9180406.html

时间: 2024-10-15 06:52:36

vue-music 关于Search(搜索页面)-- 搜索历史的相关文章

工作中搜索页面搜索记录功能的封装(存储到本地)

//!*封装添加搜索记录功能 (newRecord:str,当参数为空时为获取历史记录; num:记录数,默认为12条;) function addHisRecord(newRecord, num){ num = num || 12; //获取本地存储的记录 var hisRecord_str = window.localStorage.getItem('hisRecord_str'); //当获取到的值为null时,创建一个空数组存储进去 if(typeof hisRecord_str ==

如何在百度搜索页面中插入广告

郑重声明:本人发布分享是为了让更多的人知道这项技术的存在,从而寻找一些防止的方法,并不是想做一些非法的操作.我也很不喜欢在页面中植入广告.所以希望各位大神看了此文后能多提一些建议与改进.本人会虚心接受.不喜勿喷!!! 该技术是我无意中接触的能够跨域操作JS的情况,通过跨域JS操作可以实现在你使用百度搜索跳转到你所在的页面的时候会自动使得百度搜索页面也进行相应的跳转,从而实现操作者的很多目的.目前我通过研究已经弄懂实现原理,并未亲自尝试,所以该文也是起抛砖引玉的作用,希望各位前端大牛能进行一下研究

SharePoint Search之(八) 搜索中心站点

创建完Search Service Application之后,虽然在各个site都可以进行搜索,但是设置一个Search Center来集中处理请求还是很有必要的.Search Center提供了Farm缺省的搜索设置,可以供其他site使用.在Site Collection和Site级别,都可以通过配置Site Settings来把搜索请求提交到search center上,这样各个site 就不需要自己配置了. 如何创建一个search center呢? 用Farm Administrat

destoon公司搜索页面显示公司类型

首先找到前台模板文件:/template/default/company/search.htm 看到51行 {template 'list-company', 'tag'} 打开 /template/default/tag/list-company.htm 查看数据字典后知道公司类型的字段名是type, 在第14行加入:[{$t[type]}] 前台页面刷新后发现是[],就是没搜索出这个字段. 原因应该是模型逻辑程序里没有搜索出这个字段来. 找到模型逻辑程序文件: /module/company

iphone H5 input type=&quot;search&quot; 不显示搜索 解决办法

H5 input type="search" 不显示搜索 解决办法 H5 input type="search" 不显示搜索 解决方法 在IOS(ipad iPhone等)系统的浏览器里打开H5页面.如下写法: <input type="search" name="search” id="search"> 以上设备的键盘仍然显示“换行”. 解决方法如下:在input外面嵌套一层form: <form

解决dede搜索页面只能显示10条信息解决方案

解决dede搜索页面只能显示10条信息解决方案,感觉显示的信息太少,这时就要想办法去解决一下.看看有什么好办法来解决一下这个问题. dede搜索页模板中,默认只能显示10条记录. 打开dede搜索页模板search.htm,发现标签搜索{dede:list perpage='10'} 即使修改了参数,如{dede:list perpage='20'},发现dede搜索页搜索的结果依然是一页10条记录. 两种方法可以解决这个问题: 1.可以在dede模板的开始搜索按钮前加入<input type=

java读取某个目录下所有文件并通过el表达式将相关文件信息展示出来,js提供页面搜索及查看下载功能

从服务器上读取某个目录下的文件  将文件名 文件修改日期   及文件 大小展示在前台  并可以查看及下载 第一步:读取文件目录下的文件,并将文件按时间由大到小排列 public ArrayList<File> getLogs() { // TODO Auto-generated method stub ArrayList<File>  tomcatLogs = new ArrayList<File>(); File path = new File(""

WordPress 如何搜索文章内容而不搜索页面页面

如何在WordPress 中只搜索指定的文章类型?在http://www.wpbeginner.com上了解到通过WP提供的钩子"pre_get_posts"方法可能实现 该钩子方法可以使你在查询数据库之前对查询条件进行处理,将下面的代码放到主题的functin.php中即可实现在搜索时仅搜索文章内容 /** * [只对指定的类型进行搜索] * @param [type] $query [搜索的参数] */ function SearchFilter($query) { //仅搜索时

android重写webview长按时选择文字然后点击搜索按钮的事件,默认是chrome接受点击事件,现在跳转到360搜索页面

用这个FindWebView替换默认使用的webview就可以了,重写SelectedText 类里地 show方法 string data就是获取到的选中的文字 import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.os.Build; imp