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

  1. <div class="search-box">
  2. <i class="icon-search"></i>
  3. <input type="text" class="box" :placeholder="placeholder" v-model="query">
  4. <i class="icon-dismiss" v-show="query" @click="clear"></i>
  5. </div>
  1. export default {
  2. props:{
  3. placeholder:{
  4. type:String,
  5. default:'搜索歌曲、歌手'
  6. }
  7. },
  8. data(){
  9. return {
  10. query:''
  11. }
  12. },
  13. created(){
  14. this.$watch('query',(newQuery) => {
  15. this.$emit('query',newQuery);
  16. })
  17. },
  18. methods:{
  19. clear(){
  20. this.query = '';
  21. },
  22. setQuery(query){ // 创建主动设置input 变量值,赋值给父级data中
  23. this.query = query;
  24. }
  25. }
  26. }

search.vue

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

  1. <li class="item" v-for="item in hotKey" @click="addQuery(item.k)"><span>{{item.k}}</span></li>
  2.  
  3. methods:{
  4. addQuery(query){
  5. this.$refs.searchBox.setQuery(query);
  6. },
  7. onQueryChange(query){    //监听派发过来的query 属性,报存到父级的data 变量中,可以用于判断用户是否有输入搜索值做相应的业务逻辑
  8. this.query = query;
  9. },
  10. _getHotKey(){
  11. getHotKey().then((res) => {
  12. if(res.code === ERR_OK){
  13. this.hotKey = res.data.hotkey.slice(0,10);
  14. }
  15. })
  16. }
  17. },

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

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

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

  1. <scroll class="suggest" :data="result" :pullup="pullup" @scrollToEnd="searchMore" ref="suggest">
  2. <ul class="suggest-list">
  3. <li class="suggest-item" v-for="item in result">
  4. <div class="icon">
  5. <i :class="getIconCls(item)"></i>
  6. </div>
  7. <div class="name">
  8. <p class="text" v-html="getDisplayName(item)"></p>
  9. </div>
  10. </li>
  11. <loading v-show="hasMore" title=""></loading>
  12. <div class="under-line" v-show="!hasMore">到我底线了</div>
  13. </ul>
  14. </scroll>

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

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

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

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

  1. import {search} from "api/search.js";
  2. import {ERR_OK} from "api/config.js";
  3. import {createSong} from "common/js/song.js";
  4. import Scroll from 'base/scroll/scroll.vue'
  5. import Loading from 'base/loading/loading.vue'
  6.  
  7. const TYPE_SINGER = 'singer';
  8. const perpage = 20;
  9. export default {
  10. props:{
  11. query:{
  12. type:String,
  13. default:''
  14. },
  15. showSinger:{
  16. type:Boolean,
  17. default:true
  18. }
  19. },
  20. data(){
  21. return {
  22. page:1,
  23. result:[],
  24. pullup:true,
  25. hasMore:true
  26. }
  27. },
  28. methods:{
  29. search(){
  30. this.page = 1;
  31. this.hasMore = true;
  32. this.$refs.suggest.scrollTo(0,0);
  33. search(this.query,this.page,this.showSinger,perpage).then((res) => {
  34. if(res.code === ERR_OK){
  35. this.result= this._genResult(res.data);
  36. this.checkMore(res.data);
  37. }
  38. })
  39. },
  40. searchMore(){
  41. if(!this.hasMore){
  42. return;
  43. }
  44. this.page++;
  45. search(this.query,this.page,false,perpage).then((res) => {
  46. if(res.code === ERR_OK){
  47. this.result= this.result.concat(this._genResult(res.data));
  48. console.log(this.result)
  49. this.checkMore(res.data);
  50. }
  51. })
  52. },
  53. checkMore(data){
  54. let song = data.song;
  55. if(!song.list.length || (song.curnum + song.curpage * perpage) >= song.totalnum){
  56. this.hasMore = false;
  57. }
  58. },
  59. getIconCls(item){
  60. if(item.type === TYPE_SINGER){
  61. return 'icon-mine'
  62. }else{
  63. return 'icon-music'
  64. }
  65. },
  66. getDisplayName(item){
  67. if(item.type === TYPE_SINGER){
  68. return item.singername;
  69. }else{
  70. return `${item.name} - ${item.singer}`
  71. }
  72.  
  73. },
  74. _genResult(data){
  75. let ret = [];
  76. if(data.zhida && data.zhida.singerid){
  77. ret.push({...data.zhida,...{type:TYPE_SINGER}})
  78. }
  79. if(data.song){
  80. ret = ret.concat(this._normalizeSongs(data.song.list));
  81. }
  82. return ret;
  83. },
  84. _normalizeSongs(list){
  85. let ret = [];
  86. list.forEach((musicData) => {
  87. if(musicData.songid && musicData.albumid){
  88. ret.push(createSong(musicData))
  89. }
  90. })
  91. return ret;
  92. }
  93. },
  94. watch:{
  95. query(){
  96. this.search();
  97. }
  98. },
  99. components:{
  100. Scroll,
  101. Loading
  102. }
  103. }

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. 使用tcpdump监控网络消息发送

    tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具. tcpd ...

  2. ZooKeeper开发者指南(五)

    引言 这个文档是为了想利用ZooKeeper的协调服务来创建分布式应用的开发者提供的指南.它包括概念和实践的信息. 这个文档的一开始的的四部分呈现了不同ZooKeeper高级概念的的讨论.理解Zook ...

  3. UVA 11440 Help Tomisu

    https://vjudge.net/problem/UVA-11440 题意: 求2——n! 之间有多少个整数x,满足x的所有素因子都大于m 保证m<=n x的所有素因子都大于m 等价于 x和 ...

  4. UVA 12716 GCD XOR

    https://vjudge.net/problem/UVA-12716 求有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b 结论:若gcd(a, ...

  5. vijos 1907 DP+滚动数组

    描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告 ...

  6. [洛谷P3304] [SDOI2013]直径

    洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...

  7. jsp03( javabeans)

    1.javabean简介 Javabeans就是符合某种特定规范Java类.使用Javabeans的好处是[解决代码的重复编写],减少代码冗余,功能区分明确,提高代码的维护性. 2.javabean的 ...

  8. bzoj3671 [Noi2014]随机数生成器

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3671 [题解] 贪心从1...n*m取,开两个5000*5000的数组就够了,可以重复利用, ...

  9. 记一次Node项目的优化

    这两天针对一个Node项目进行了一波代码层面的优化,从响应时间上看,是一次很显著的提升.一个纯粹给客户端提供接口的服务,没有涉及到页面渲染相关. 背景 首先这个项目是一个几年前的项目了,期间一直在新增 ...

  10. 编译zpool命令

    环境:192.168.50.239(在 illumos源码中编译zpool命令) PS:由于对zpool命令的工作原理不熟悉,所以编译,可在其中加入调试语句来明白其原理 首先介绍 illumos-so ...