一、iScroll.js

iScroll是一个高性能,资源占用少,无依赖,多平台的javascript滚动插件,PC端、移动端都可以使用,在Vue、Nuxt等工程化项目中也可以使用,应用场景使用广泛。具体使用方法请查阅文档。

二、遇到的问题

1、场景描述

我是在 Nuxt 项目中,封装了一个关键词远程搜索的下拉框组件,输入关键词后,去后台搜索相关数据,下拉框内只能展示5条数据,需要向下滚动来查看其他数据,然后为避免数据量过大,限制每次加载十条数据,通过点击列表最后的加载更多项来加载更多数据。

2、 问题描述以及解决方案

第一个坑:

在引入iScroll.js之后,首先要声明一个全局的IScroll对象,在 Nuxt 则需要借助 Window 对象,来将声明的IScroll对象挂载到全局:

// 声明 IScroll 对象 并挂载到全局
window.myScroll = new window.IScroll('#wrapper', {mouseWheel: true,scrollbars: true,startY: scrollY
})

一开始我是在 生命周期的mounted阶段生命并挂载的该对象,运行之后发现,iScroll 不起作用,下拉列表无法滚动,但是通过开发者工具,发现iScroll的相关属性已经出现在dom里了。在经过一系列的排查后,发现是因为,下拉列表渲染的数据是从后台获取的,当我们在 mounted 阶段挂载 IScroll 对象的时候,列表数据还并没有从后台获取到并渲染,页面还并不存在该dom元素,所以 iScroll 获取不到对应的元素,无法分辨出列表的真实长度 , IScroll 对象也就无法起作用,滚动条也不会出现。

解决方案:

通过this.$nextTick(),当页面渲染完成之后,再去声明和挂载 IScroll 对象:

async getSchoolList () {// 每次只显示10条相关数据const params = {pageIndex: this.pageIndex,pageSize: 10}// 去后台获取数据const res = await this.$axios.post('/api/', params)// 待页面渲染完成后,再声明和挂载this.$nextTick(() => {window.myScroll = new window.IScroll('#wrapper', {mouseWheel: true,scrollbars: true,startY: scrollY})})},
第二个坑:

踩过前面的坑之后,非常顺利的我又掉进的第二个坑,前面说过了,为了避免数据量过大,对数做了分页处理,每次只加载10条数据,然后问题就出现了,第一次加载10条数据后,iScroll 生成的滚动条没有任何问题。但是再次加载10条数据时,问题出现了,因为此时的列表有20条数据了,列表长度变长,滚动条应该变小。滚动条确实变量小了,但是第一次10条数据时生成的滚动条并没有消失,而是跟20条数据的滚动条出现了重叠,30条、40条也是如此,这就很难受。

解决方案:

一开始我以为是 iScroll.js 本身的缺陷,但觉得如此广泛使用的插件怎么可能会有这么严重的问题呢。经过思考我得出了最终破案了,这是因为使用this.$nextTick() 的问题,我是在这中间声明和挂载的iscroll对象,这样就会导致在每一次重新获取数据并渲染页面的时候,都会重新声明并挂载一个iscroll对象,所以才会出现数据变化时,旧滚动条没有消失的现象。
我想了一个取巧的解决方案,在每次重新渲染的时候,都将先将前面的滚送条给隐藏掉:

    async getSchoolList () {// 每次只显示10条相关数据const params = {pageIndex: this.pageIndex,pageSize: 10}const res = await this.$axios.post('/api/', params)// 当数据增加之后 iscroll 原来的滚动条还存在 所以要将之前的所有滚动条隐藏掉const n = document.querySelectorAll('.iScrollIndicator')n.forEach((item) => {item.style.display = 'none'})// 待页面渲染完成后,再声明和挂载  生成一个新的滚动条this.$nextTick(() => {window.myScroll = new window.IScroll('#wrapper', {mouseWheel: true,scrollbars: true,startY: scrollY})})},

下拉列表组件使用 iScroll.js 实现滚动效果遇到的坑相关推荐

  1. JQuery——BreakingNews.js新闻滚动效果

    BreakingNews.js新闻滚动效果 这里是直观效果展示 使用这种效果我们需要三个包 jq.min.js BreakingNews.css breakingnews.js breakingnew ...

  2. scrolltop 原生js_解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法...

    最近在做博客的目录功能,发现一个在现代浏览器间的一个bug,或是称之为差异,即页面滚动值(scrollTop)的获取与设定. 在此之前先说一下关于页面元素的坐标获取,这张图的经典性不必再提. 实现滚动 ...

  3. html js 链接滚动效果,【JS特效】不间断滚动效果通用类

    网上发现一个不错的js不间断滚动效果,今天来转载一下吧.这个js的作者应是崔永祥(因其博客已不存在,而无法确认),我这里只简单整理,只为笔记. ??? 需要通过样式,js来实现这个翻滚效果. ??? ...

  4. CSS3 + JS 数字滚动效果

    原生JS+CSS3版: <!DOCTYPE html> <html> <head><title>CSS3 数字滚动效果</title> &l ...

  5. js数字滚动效果组件

    因为在网上没有找到想要的效果,因此自己整了一个简单的.有需要的可以自己拿去改,需要引入jquery. gif录制太麻烦了,就不搞了,放个图片意会一下 调用方式 // 第一个参数elementId:元素 ...

  6. fullPage.js去除slides的触屏滚动效果

    fullPage.js左右滚动效果,在手机,平板和笔记本上带有触屏滚动,去除的话,可以试试以下方法 修改fullpage 1.主页面引入换成fullpage.js 2. 找到setAllowScrol ...

  7. html加js实现滚动图片,js实现图片无缝滚动

    js无缝滚动效果几乎在任何网页上都能看到它的身影,有的可能是使用插件,其实使用原始的javascript比较简单. 主要的是使用js位置知识. 1.innerHTML:设置或获取元素的html标签 2 ...

  8. JS图片自动或者手动滚动效果(支持left或者up)

    JS图片自动或者手动滚动效果 在谈组件之前 来谈谈今天遇到搞笑的事情,今天上午接到一个杭州电话 0571-28001187 即说是杭州人民法院的 貌似说我用招商银行信用卡在今年的6月23日借了招商银行 ...

  9. html5页面可见xing,【 前端资源 网页插件 】全屏滚动效果H5FullscreenPage.js

    前提: 介于现在很多活动都使用了 类似全屏滚动效果 尤其在微信里面 我自己开发了一个快速构建 此类项目的控件 与市面上大部分控件不同的是此控件还支持元素的动画效果 并提供多种元素效果 基于zepto. ...

最新文章

  1. 2.4 Go语言基础之切片
  2. 深度强化学习入门到精通--资料综述
  3. UIKit Particle Systems in iOS 5 Tutorial ( 附雨的粒子效果 )
  4. 爪哇国新游记之二十----将数字转换成中国汉字大写形式
  5. MySQL之 视图,触发器,事物,存储过程,函数(Day48)
  6. U盘安装Debian 6 amd64版本
  7. Rootkit 后门的利用
  8. 软件需求说明书模板1
  9. win11快捷键常用表 最全面的win11快捷键使用指南
  10. linux pl2303 驱动下载,ubuntu装pl2303USB转串口驱动(详细,亲测)
  11. 【数值预报】按时间维度合并/重新生成nc、grib网格数据(按天、小时组织的文件合并成按月组织文件)
  12. 优秀的人都在读的10本好书!
  13. 六大云计算厂商南山论剑,收下这封英雄帖!
  14. 2009级 华中科技大学 计算机学院 本科生名单,华中科技大学2009年本科特优生名单...
  15. Oracle sqlldr导入之“MAXIMUM ERROR COUNT EXCEEDED”
  16. [转载] 深入 superviser
  17. react+antd修改主题色
  18. 游戏背景音乐的两个特殊类型
  19. R语言数据分析120题
  20. 【shopify 1】调研出海项目,发现shopify没有java的相关SDK接口,但是找到一个最新2022年6月的Java项目分享了相关代码,使用docker进行环境搭建、编译,并成功启动

热门文章

  1. unity中连接Xbox手柄设置及按键检测
  2. ios和android区别是什么,app测试中ios和Android的区别:
  3. Java版本电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展
  4. 可拖拽,拉伸的盒子(类似我们的桌面应用框,可以拉伸放大,可以拖拽移动)
  5. sol日历只能在android,手机日历如何实现共享:分别使用苹果日历和SOL日历
  6. python执行sql查询脚本并填写到excel_用Python执行SQL、Excel常见任务?10个方法全搞定!...
  7. 博途SCL伪随机数产生(全局库解析)
  8. Dell precision3530 拆机加装内存条全流程(有图)
  9. C#串口通讯之-PC串口发送数据
  10. 新书推荐 | OpenShift在企业中的实践:PaaS DevOps 微服务