搜索结果 列表点击跳转到相应的歌手详情页或者 歌曲页面,通过子路由跳转,和singer 组件一样

在suggest.vue 组件判断如果点击的是歌手,则new 一个歌手对象,通过这个对象的id 属性值传递给路由的参数,通过vuex 传递歌手数据

<li class="suggest-item" v-for="item in result" @click="selectItem(item)">

selectItem(item){
if(item.type === TYPE_SINGER){
let singer = new Singer({
id:item.singermid,
name:item.singername
})
this.$router.push({
path:`/search/${singer.id}`
})
this.setSinger(singer)
}else{
...//歌曲点击逻辑
}
},

歌曲点击的逻辑和之前选择歌手点击列表逻辑不同,之前是改变所有的playlist 列表,而搜索出来的列表点击 只需要向当前playlist 列表添加一首即可,不需要改变整个playlist 播放列表

点击添加一首歌需要更改操作三个状态,在actives.js 中写相关commit insetSong 函数 插入一首搜索结果的歌曲,然后判断与原来的播放列表中是否有这首歌曲,如果有则删除,更新playlist 和 sequenceList 列表

export const insertSong = function ({commit,state},song){
let playlist = state.playlist.slice();
let sequenceList = state.sequenceList.slice();
let currentIndex = state.currentIndex; //记录当前歌曲
let currentSong = playlist[currentIndex];
// 查找当前列表中是否有待插入的歌曲并返回其索引
let fpIndex = findIndex(playlist, song)
// 因为是插入歌曲,所以索引+1
currentIndex++
// 插入这首歌到当前索引位置
playlist.splice(currentIndex, 0, song)
// 如果已经包含了这首歌
if (fpIndex > -1) {
// 如果当前插入的序号大于列表中的序号
if (currentIndex > fpIndex) {
playlist.splice(fpIndex, 1)
currentIndex--
} else {
playlist.splice(fpIndex + 1, 1)
}
} let currentSIndex = findIndex(sequenceList, currentSong) + 1
let fsIndex = findIndex(sequenceList, song)
sequenceList.splice(currentSIndex, 0, song)
if (fsIndex > -1) {
if (currentSIndex > fsIndex) {
sequenceList.splice(fsIndex, 1)
} else {
sequenceList.splice(fsIndex + 1, 1)
}
}
commit(types.SET_PLAYLIST, playlist)
commit(types.SET_SEQUENCE_LIST, sequenceList)
commit(types.SET_CURRENT_INDEX, currentIndex)
commit(types.SET_FULL_SCREEN, true)
commit(types.SET_PLAYING_STATE, true)
}

边界处理。如果搜索无结果,显示no-result 组件,当前搜索输入框每一次输入时都会监听query 变化去请求,从源头做节流函数延时200 毫秒去监听请求,减少发无效的请求

export function debounce(func, delay) {        //函数科里化
let timer return function (...args) {
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
func.apply(this, args)
}, delay)
}
}
import {debounce} from 'common/js/util.js'

created(){
this.$watch('query',debounce((newQuery) => {
this.$emit('query',newQuery);
},200))
},

在手机端当搜索完成滚动搜索列表时,底部的软键盘会当住滚动列表,要做的就是在监听scroll 滚动的时候让input 失去焦点

首先在scroll 上新增beforeScroll事件 监听beforeScrollStart 滚动开始事件,去派发一个事件。然后在搜索结果列表监听派发事件,再次派发给search 组件

在searchbox 组件里给input 设置失去焦点 blur 函数。search组件中监听搜索列表 派发事件 调用 this.$refs.searchBox.blur(); 设置失焦

// scroll.vue

if(this.beforeScroll){
this.scroll.on('beforeScrollStart',()=>{
this.$emit('beforeScroll')
})
} // search-box.vue blur(){
this.$refs.query.blur();
console.log("失焦")
} //search.vue blurInput(){
this.$refs.searchBox.blur();
}

vue-music 关于Search(搜索页面)-- 搜索结果优化的更多相关文章

  1. Vue音乐项目笔记(四)(搜索页面提取重写)

    1.如何通过betterScroll组件实现上拉刷新 https://blog.csdn.net/weixin_40814356/article/details/80478440 2.搜索页面跳转单曲 ...

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

    搜索历史展示每一次搜索过,并选中的关键字,保存数据到数组.搜索历史数据是需要在多个组件中共享的,所以保存在vuex 中 searchHistory 数组中,保存触发在搜索列表点击选中之后派发事件到se ...

  3. 【音乐App】—— Vue-music 项目学习笔记:搜索页面开发

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 搜索歌手歌曲 搜索历史保存 ...

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

    首先找到前台模板文件:/template/default/company/search.htm 看到51行 {template 'list-company', 'tag'} 打开 /template/ ...

  5. iphone H5 input type="search" 不显示搜索 解决办法

    H5 input type="search" 不显示搜索 解决办法 H5 input type="search" 不显示搜索 解决方法 在IOS(ipad iP ...

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

    解决dede搜索页面只能显示10条信息解决方案,感觉显示的信息太少,这时就要想办法去解决一下.看看有什么好办法来解决一下这个问题. dede搜索页模板中,默认只能显示10条记录. 打开dede搜索页模 ...

  7. 学习用java基于webMagic+selenium+phantomjs实现爬虫Demo爬取淘宝搜索页面

    由于业务需要,老大要我研究一下爬虫. 团队的技术栈以java为主,并且我的主语言是Java,研究时间不到一周.基于以上原因固放弃python,选择java为语言来进行开发.等之后有时间再尝试pytho ...

  8. Vue调用百度接口做百度搜索

    这两天由于学习需要,需要用vue来调用api接口,但是以前没怎么接触过用vue来调用接口,不会没关系,发挥我们强大的学习能力,都不是事,学习了半天基本也就可以初级上手了,写篇随笔记录下来,方便以后回顾 ...

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

    如何在WordPress 中只搜索指定的文章类型?在http://www.wpbeginner.com上了解到通过WP提供的钩子"pre_get_posts"方法可能实现 该钩子方 ...

  10. DEDE的搜索页面支持arclist和channelartlist标签的操作方法

    很多朋友在使用dedecms进行网站开发时都会存在这样的问题,那就是dedecms的搜索页(search.php)与我们网站页面的模板的头 部.底部不一样,并且还不支持在搜索页调用其他某一栏目的文档. ...

随机推荐

  1. Semaphore信号量

    一.前言 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去. 二.sema ...

  2. Anaconda创建python(2.7/3.6)的虚拟环境后需要添加ipykernel

    今天在工作的过程中遇到这样一个问题:安装完Anaconda利用conda创建了虚拟环境,但是启动jupyter notebook之后却找不到虚拟环境中的python kernel.后来上网找到了解决办 ...

  3. [LeetCode] 12. Integer to Roman ☆☆

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...

  4. 【JSP EL】EL表达式获取当前时间(两种方式)

    第一种方式: //先在代码段定义<% long date = new Date().getTime(); request.setAttribute("date", date) ...

  5. 10.nginx+ffmpeg上搭建HLS切片

    1.首先介绍一下HLS协议: (1)简介 这个协议是由苹果公司提出并推广使用的,维基百科介绍如下: HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络 ...

  6. UVA 12034 Race

    https://vjudge.net/problem/UVA-12034 题意:n个人比赛,有多少种可能的结果 假设i个人中,有j个人是第一名,方案数为C(i,j) 所以ans=Σ C(n,j)* f ...

  7. SSL 证书类型说明: DV OV EV

    内容来自: ssl 证书的三种类型: dv (域名型) , ov (企业型) 和 ev (扩展型) OV.DV和EV证书的区别 另外: 浏览器兼容性测试报告 Symantec 证书为什么相比其他证书要 ...

  8. lua中的继承

    做为一个java出身的程序媛,长时间做Lua,重复一些工作后,特别想用继承.其实很简单.因为我有一大部分的场景,背景长的都一样,所以打算做一个父类. 需要注意的是,如果子类有和父类的同名函数,就会被覆 ...

  9. js基础知识点收集

    js基础知识点收集 js常用基本类型 function show(x) { console.log(typeof(x)); // undefined console.log(typeof(10)); ...

  10. ImageView设置边框 以及内部图片居中显示 在AndroidStudio中添加shape.xml文件

    效果如图 边框设置:shape文件 <shape xmlns:android="http://schemas.android.com/apk/res/android"> ...