建立搜索框组件页面,searchBox,组件接受一个可以自定义传入的placeholder 属性。input v-model 双向绑定数据关联到query 中, 在created中监听 query 变量将改变的新值派发给外部父组件,在search.vue 组件中将其引入

<div class="search-box">
<i class="icon-search"></i>
<input type="text" class="box" :placeholder="placeholder" v-model="query">
<i class="icon-dismiss" v-show="query" @click="clear"></i>
</div>
export default {
props:{
placeholder:{
type:String,
default:'搜索歌曲、歌手'
}
},
data(){
return {
query:''
}
},
created(){
this.$watch('query',(newQuery) => {
this.$emit('query',newQuery);
})
},
methods:{
clear(){
this.query = '';
},
setQuery(query){ // 创建主动设置input 变量值,赋值给父级data中
this.query = query;
}
}
}

search.vue

热门搜索模块,通过search.js 的getHotKey 函数异步获取数据,并渲染,给每个item 上绑定addQuery(item.k) 将其值赋值给input 的value 值,通过调用 this.$refs.searchBox.setQuery(query)

<li class="item" v-for="item in hotKey" @click="addQuery(item.k)"><span>{{item.k}}</span></li>

methods:{
addQuery(query){
this.$refs.searchBox.setQuery(query);
},
onQueryChange(query){    //监听派发过来的query 属性,报存到父级的data 变量中,可以用于判断用户是否有输入搜索值做相应的业务逻辑
this.query = query;
},
_getHotKey(){
getHotKey().then((res) => {
if(res.code === ERR_OK){
this.hotKey = res.data.hotkey.slice(0,10);
}
})
}
},

当搜索框有关键词的时候,就应该发出请求 搜索对应的歌曲或者歌手。请求数据格式返回 包含两个字段,song 为搜索歌曲数据,zhida 为搜索关键字为歌手的数据,上拉加载后面再说,首先要把获取的数据格式化成想要的数据格式

通过_genResult 方法判断如果搜索结果中有zhida字段并且有zhida.singerid 则说明搜索关键字为歌手,将其push到新数组中,判断是否有相关歌曲song 字段 ,再把歌曲列表追加到新数组中并返回

创建suggest.vue 组件展示搜索结果列表,如果列表项是歌手前面的图标根据返回的结果来判断替换相应图标。歌手名称和歌曲名称同理

<scroll class="suggest" :data="result" :pullup="pullup" @scrollToEnd="searchMore" ref="suggest">
<ul class="suggest-list">
<li class="suggest-item" v-for="item in result">
<div class="icon">
<i :class="getIconCls(item)"></i>
</div>
<div class="name">
<p class="text" v-html="getDisplayName(item)"></p>
</div>
</li>
<loading v-show="hasMore" title=""></loading>
<div class="under-line" v-show="!hasMore">到我底线了</div>
</ul>
</scroll>

引入sceoll 组件,开启上拉加载事件 :pullup:'true'

if(this.pullup){
this.scroll.on('scrollEnd',()=>{
if(this.scroll.y <= (this.scroll.maxScrollY + 50)){    //当滚动距离离底部50 像素的时候,派发事件,父级监听此事件做再次请求数据接口
this.$emit('scrollToEnd')
}
})
}

监听派发上拉加载事件 @scrollToEnd="searchMore"

在首次加载数据的时候设置 监测还有没有数据的标志位 hasMore = true 在成功获取前20条数据的时候调用监测函数 this.checkMore(res.data);  checkMore根据传来的请求值判断 当前页数乘以每页数量 加上 每页加载数量 如果大于等于数据的总数量,则表示下一页已无数据,设置标志位为false ,在上拉加载函数 searchMore 中 首先判断标志位,如果有数据,页码加一,再请求数据接口,将结果 concat追加到result 数据中。注意这里再一次请求的时候,将showSinger 参数设置为false,表示第二页请求不再显示歌手

import {search} from "api/search.js";
import {ERR_OK} from "api/config.js";
import {createSong} from "common/js/song.js";
import Scroll from 'base/scroll/scroll.vue'
import Loading from 'base/loading/loading.vue' const TYPE_SINGER = 'singer';
const perpage = 20;
export default {
props:{
query:{
type:String,
default:''
},
showSinger:{
type:Boolean,
default:true
}
},
data(){
return {
page:1,
result:[],
pullup:true,
hasMore:true
}
},
methods:{
search(){
this.page = 1;
this.hasMore = true;
this.$refs.suggest.scrollTo(0,0);
search(this.query,this.page,this.showSinger,perpage).then((res) => {
if(res.code === ERR_OK){
this.result= this._genResult(res.data);
this.checkMore(res.data);
}
})
},
searchMore(){
if(!this.hasMore){
return;
}
this.page++;
search(this.query,this.page,false,perpage).then((res) => {
if(res.code === ERR_OK){
this.result= this.result.concat(this._genResult(res.data));
console.log(this.result)
this.checkMore(res.data);
}
})
},
checkMore(data){
let song = data.song;
if(!song.list.length || (song.curnum + song.curpage * perpage) >= song.totalnum){
this.hasMore = false;
}
},
getIconCls(item){
if(item.type === TYPE_SINGER){
return 'icon-mine'
}else{
return 'icon-music'
}
},
getDisplayName(item){
if(item.type === TYPE_SINGER){
return item.singername;
}else{
return `${item.name} - ${item.singer}`
} },
_genResult(data){
let ret = [];
if(data.zhida && data.zhida.singerid){
ret.push({...data.zhida,...{type:TYPE_SINGER}})
}
if(data.song){
ret = ret.concat(this._normalizeSongs(data.song.list));
}
return ret;
},
_normalizeSongs(list){
let ret = [];
list.forEach((musicData) => {
if(musicData.songid && musicData.albumid){
ret.push(createSong(musicData))
}
})
return ret;
}
},
watch:{
query(){
this.search();
}
},
components:{
Scroll,
Loading
}
}

vue-music 关于Search(搜索页面)--上拉加载的更多相关文章

  1. UITableView与UISearchController搜索及上拉加载,下拉刷新

    #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableVi ...

  2. Vue mint ui用在消息页面上拉加载下拉刷新loadmore 标记

    之前总结过一个页面存在多个下拉加载的处理方式,今天再来说一下在消息页面的上拉加载和下拉刷新,基本上每个app都会有消息页面,会遇到这个需求 需求:每次加载十条数据,上拉加载下拉刷新,并且没有点击查看过 ...

  3. h5 实现页面上拉加载更多数据

    您好,您的上拉加载更多的代码来喽: html:(style部分:html部分:js部分--js部分主要就是监控上拉,调接口) //上拉加载更多css <style> .wait-loadi ...

  4. 微信小程序开发注意事项总结:上拉加载失效、转义字符等

    1.上拉加载失效 问题背景:部分页面上拉加载失效.当使用flex布局,底部固定,中间采用自适应撑满全屏实现滚动时,发现上拉加载失效,不知道是什么原因. 解决问题: 在小程序中,官方为我们提供了原生的下 ...

  5. vue-scroller实现vue单页面的上拉加载和下拉刷新问题

    在vue中如何简单的实现页面的上拉加载和下拉刷新,在这里我推荐使用vue-scrolle插件. vue-scrolle的基本使用方法: 1.下载 npm i vue-scroller -D 2.导包 ...

  6. vue.js移动端app实战4:上拉加载以及下拉刷新

    上拉加载以及下拉刷新都是移动端很常见的功能,在搜索或者一些分类列表页面常常会用到. 跟横向滚动一样,我们还是采用better-scroll这个库来实现.由于better已经更新了新的版本,之前是0.几 ...

  7. vue移动端下拉刷新、上拉加载

    由于自身的项目比较简单,只有几个H5页面,用来嵌入app中,所有没有引入移动端的UI框架,但是介于能让用户在浏览H5页面时有下拉刷新和上拉加载,有更好的用户体验,自己写组件实现. 1.下拉刷新Drop ...

  8. Vue-上拉加载与下拉刷新(mint-ui:loadmore)一个页面使用多个上拉加载后冲突问题

    所遇问题: 该页面为双选项卡联动,四个部分都需要上拉加载和下拉刷新功能,使用的mint-ui的loadmore插件,分别加上上拉加载后,只有最后一个的this.$refs.loadmore.onTop ...

  9. Vue(小案例_vue+axios仿手机app)_上拉加载

    ---恢复内容开始--- 一.前言                                                                                    ...

随机推荐

  1. redis 选择数据库

    redis 127.0.0.1:6379> SELECT 1 # 使用 1 号数据库

  2. linux下bash脚本语法

    1.shell中的变量定义和引用(1)变量定义和初始化.shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言:变量没有明确类型就是弱类型语言),和C语言不同.在shell编程中定义变量 ...

  3. android AsyncTask介绍 AsyncTask和Handler对比

    1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可 ...

  4. mysql 事务,锁,与四大隔离级别

    概念 事务 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行. 一致性:事务结束的时候,所有的内部数据都是正确的. 隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个 ...

  5. [洛谷P1404] 平均数

    洛谷题目链接:平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来 ...

  6. Item 1----------考虑用静态工厂方法代替构造器

    读书,有时候,我感觉总是有点绕和不具体.我阅读了代码,理解代码后,才有一种理解和把握的感觉. 优点三.   把某个对象的构建放给客户端来实现. 比如下面的实现,客户端Test,获取Service的实例 ...

  7. HDU 1026 Ignatius and the Princess I (广搜)

    题目链接 Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius ...

  8. java===java基础学习(7)---用户自定义类

    package testbotoo; import java.util.*; public class EmployeeTest { public static void main(String[] ...

  9. mysql 5.6在gtid复制模式下复制错误,如何跳过??

    mysql 5.6在gtid复制模式下复制错误,如何跳过?? http://www.xuchanggang.cn/archives/918.html

  10. 1438. Shopaholic

    Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Lindsay is a shopaholic. Whenever th ...