1.前端面试题 上拉加载,源码下拉刷新 vue怎么实现
2.如何重构一个过万Star开源项目—BetterScroll
3.BetterScroll 2.0 发布:精益求精,源码与你同行
4.betterScroll能实现多种滚动吗?
5.BetterScroll之插件化 的源码架构设计
6.betterscroll只能向上拉一段距离就拖不动了?
前端面试题 上拉加载,下拉刷新 vue怎么实现
下拉刷新和上拉加载这两种交互方式常见于移动端,源码类似于PC网页的源码分页,但交互形式不同。源码mt4源码改成股票源码
开源社区提供了多种解决方案,源码例如iscroll、源码better-scroll、源码pulltorefresh.js等库,源码使用这些库非常方便。源码
通过原生方法实现一次上拉加载和下拉刷新,源码有助于更好地理解和使用第三方库。源码
上拉加载和下拉刷新都依赖于用户交互,源码关键在于理解在什么场景和时机触发交互动作。源码
上拉加载的本质是页面触底或即将触底时的动作。
要判断页面是否触底,需要了解以下属性:offsetTop、offsetWidth、scrollLeft、scrollTop、scrollWidth、scrollHeight、clientWidth、clientHeight。
触底公式为:clientHeight + scrollTop >= scrollHeight - offsetHeight。
下拉刷新的本质是页面置于顶部时,用户下拉时需要触发的动作。
原生实现下拉刷新主要分为三步:监听touchstart事件记录初始值,监听touchmove事件记录滑动差值,监听touchend事件。html静态源码
在实际开发中,更多使用第三方库,以下以better-scroll为例。
HTML结构如下:
实例化上拉下拉插件,通过use来注册插件,实例化BetterScroll并传入相关参数。
使用better-scroll实现下拉刷新和上拉加载时,要注意兼容性、易用性和性能等因素。
下拉刷新和上拉加载原理简单,但封装过程中要考虑兼容性、易用性、性能等细节。
如何重构一个过万Star开源项目—BetterScroll
在过去的三年多时间里,BetterScroll v1版本因其出色的移动端滚动体验与性能,以及对多种滚动场景的全面支持,吸引了广大社区用户的关注。借助于BetterScroll,我们还开源了一个基于Vue2.0的移动端组件库cube-ui。当前,BetterScroll的Star数量已超过1.1万,有约3.2万仓库使用了它。滴滴内部的核心业务,如国内和国外的乘客与司机两端业务,均大量依赖于BetterScroll,它经受住了各种业务场景的考验。 然而,随着大量业务场景的应用与社区反馈,v1版本也暴露出一些问题,主要集中在四个方面。http 代理 源码为了解决这些问题,BetterScroll v2版本应运而生。解决包体积过大的问题
v1版本的包体积过大,主要是由于Feature(如picker、slide、scrollbar等)代码与核心滚动代码混杂在一起,导致无法实现按需引入。为解决这个问题,我们采用了插件化方案,将各个Feature代码拆分独立,通过CoreScroll进行事件与属性代理。Lerna被用于管理多个包,@better-scroll作为包命名前缀,便于用户识别。使用TypeScript开发,结合成熟的社区生态,BetterScroll的Feature丰富,未来还会继续增加,这种插件化机制非常适合。解决扩展困难的问题
v1版本新增Feature时,逻辑代码与核心滚动代码混杂,导致后期扩展与维护难度增加,包体积增长无限制。在v2版本中,我们将Feature与CoreScroll部分彻底分离,采用插件模式,解决了包体积问题,同时扩展性也得到了增强,迭代稳定性得到了提升。解决测试匮乏的php签到源码问题
v1版本测试覆盖率不到%,测试编写困难,影响后期迭代稳定性。在v2版本中,我们增加了单元测试,并引入了功能测试以确保整体功能的稳定性。Jest作为测试框架,结合Mock、Test Runner、Snapshot等功能,实现开箱即用。借助Jest manual-mocks能力,我们能够更明确地编写单元测试。解决文档不够友好的问题
v1版本的文档和示例代码被用户吐槽,尤其是示例耦合了无关的Vue逻辑。在v2版本中,我们选择了VuePress作为文档框架,利用其Vue、webpack和Markdown能力,实现国际化、定制主题和插件化扩展。为了解决在markdown中展示示例组件代码的问题,我们开发了extract-code插件,确保每次示例代码更改时,文档内容也随之更新。 回顾BetterScroll 2.0版本的开发历程,虽然充满挑战,但收获、总结与沉淀成为了主要成果。BetterScroll 2.0已稳定发布,经过多个alpha版本迭代,空间钓鱼源码已有大量下载与使用。未来,我们将持续优化组件库,进一步提升性能,为业务提供更高效的支持。作者嵇智,滴滴出行资深软件开发工程师。BetterScroll 2.0 发布:精益求精,与你同行
BetterScroll v1版本自发布至今已有超过两年时间,在我们公司内部和社区范围内,经过了大量的业务场景考验,增加了许多特性。不论是内部开源组件库cube-ui,还是社区内的mpx、taro、vue-better-scroll组件底层,都依赖BetterScroll实现。大家都愿意尝试BetterScroll的主要原因有三个:良好的事件系统、优秀的滚动体验和覆盖了较多移动端常见滚动场景。
v1版成果显著,star数量已经超过前辈,得到了社区的认可。尽管iscroll在年停止了维护,但BetterScroll仍持续被维护,并从中汲取了大量业务场景和社区反馈,形成了对v2版本的需求。v2版的初衷正是解决v1版本中所有功能都通过选项选项实现的问题,用户被迫加载许多冗余代码的情况。v1版本无法实现按需加载,随着功能扩展,用户必须加载不必要的代码,因为绝大多数场景只需要其中几个功能。
当然,v1版本的实现并非不好,这是类库演化的必然过程。从支持简单场景到多功能场景,再到分包实现可插拔功能,BetterScroll 2.0因此而诞生。v2版采用插件化的架构设计,CoreScroll作为最小的滚动单元,提供了丰富的事件和钩子,其他功能由不同的插件扩展,使BetterScroll更加灵活且解耦不同场景。每个插件都是一个npm包,使用TypeScript编写,内部分享了TypeScript的优点。
实现基本滚动需求的代码如下,除了package的引入,使用方式与v1版本一致。以下是各插件功能概览:
1. 拉动下拉刷新插件,实现仿App下拉刷新效果。
2. 拉动上拉加载插件,实现仿App上拉加载效果。
3. 仿微信小程序movable-view插件。
4. slide插件,用于轮播焦点图。
5. zoom插件,实现放大缩小功能。
6. 仿iOSpicker组件插件。
7. 自定义滚动条插件。
8. 鼠标滚轮交互插件。
9. 实现列表无限滚动加载,对于大量数据渲染有显著效果。
. 协调双层BetterScroll嵌套滚动行为插件。
得益于插件化的架构设计,BetterScroll可以根据多种滚动场景扩展更多插件。由于插件在不同npm包中,用户无需被迫加载冗余代码。通过引入TypeScript,我们提供了一种更友好的开发体验。TypeScript在动态语言和面向对象编程中使用得当,为BetterScroll 2.0的重构带来了诸多便利。加载插件后,示例、代码、二维码、复制功能等在文档中得到了整合,方便PC和手机用户预览、调试代码。我们还提供了一个FAQ版块,汇集了经典问题和解决方案,降低了遇到“疑难杂症”的成本。
通过十多个插件,我们可以看到BetterScroll可能只是冰山一角,期待与你一起参与BetterScroll生态的共建,抽象出更多插件。我们已经准备了如何编写BetterScroll插件的教程,GitHub仓库地址已提供,通过预览地址可以查看效果。此外,我们欢迎社区成员共同完善BetterScroll生态,提出好建议。
总结与规划:BetterScroll仍然是一个不断发展的项目,我们持续思考和巩固BetterScroll,同时也欢迎社区成员一起参与。未来我们会朝着以下方向努力:
betterScroll能实现多种滚动吗?
vue中:在updated生命周期函数中使用 .refresh()函数 然后在每一次网络请求后或触发pullingUp事件后主动调用.finishPullUp().refresh()即可
其他平台:(有updated生命周期函数的话和上边一样)触发pullingUp后调用.finishPullUp().refresh() 即可
Tip:一般在触发pullingUp事件后都会进行网络请求,一定要在网络请求后执行那两个方法,总之就是拿到数据后在执行即可
finishPullUp() => 告诉better-scroll 已经准备好下一次的下拉加载执行条件(不调用只会触发一次下拉加载)
网上那些 onload什么的太过麻烦,这种简单、效率
BetterScroll之插件化 的架构设计
在深入理解BetterScroll 2.0的插件化架构设计之前,我们先对BetterScroll的基本信息进行简要了解。BetterScroll 是一款为移动端(已支持PC)设计的插件,主要解决各种滚动场景需求。它在保持与iscroll兼容的基础上,引入了更多特色功能和性能优化。该插件在发布多个版本后,获得了5万次npm月下载量和+的star数量。发展至2.0版本,其核心是为了支持插件的按需加载,采取了插件化架构设计。
BetterScroll 2.0采用了插件化架构,将CoreScroll作为最小的滚动单元,通过丰富事件和钩子暴露核心功能,其余功能则由不同插件扩展实现。这种设计使得BetterScroll更加灵活,能够适应多种场景需求。具体架构图请参考如下链接(注意:链接可能失效或无法直接引用)。
BetterScroll 2.0采用monorepos组织方式,使用lerna进行多包管理,每个组件独立为一个npm包。此架构与西瓜播放器类似,通过插件化设计,CoreScroll作为基础单元,其他功能通过插件实现,如长列表中的上拉加载和下拉刷新功能,分别通过pull-up和pull-down插件实现。
插件化架构的好处之一在于支持按需加载,将独立功能拆分为独立插件,核心系统更加稳定,具有一定的健壮性。接下来,本文将深入分析BetterScroll插件化架构的实现细节。
在插件化架构设计中,关键点包括插件管理、插件连接和插件通信。BetterScroll 2.0通过统一的插件开发规范进行插件管理。插件开发需遵循特定规范,如静态属性和接口实现,通过构造函数注入BetterScroll实例进行逻辑注入。
插件连接机制允许核心系统管理可用插件,通过插件注册表确定加载时机和插件信息。以PullUp插件为例,用户首先安装插件,通过BScroll.use方法注册插件,并在实例化BetterScroll时传入配置项。内部实现通过观察BScroll.use方法及源码,我们可以了解到插件注册和初始化过程。
插件通信机制依赖核心系统的事件总线功能,提供统一的通信途径。在BetterScroll中,核心系统以EventEmitter类形式提供事件总线,插件通过注入的实例进行事件通信,实现插件间的协作。
除了插件化架构设计,BetterScroll在工程化方面也采用了现代解决方案,如使用lerna进行多包管理,遵循开源库实践。项目中package.json文件和npm scripts配置展示了工程化实践。对于更多细节和学习资源,读者可以访问原作者的文章链接(注意:链接可能失效或无法直接引用)。
betterscroll只能向上拉一段距离就拖不动了?
我的是在GoodsItemList这个组件中写的,如果要是页面滚动正常,就需要让srollheight等于所有要加载的高度,所以这里就应该在每次加载一张图品后重新就计算一遍scrollheight,就要用better-scroll中的refresh()方法。
具体操作:
首先GoodsItemList这个组件中,对标签监听@load,然后起一个方法名imageLoad
<img :src="goodsItem.show.img" alt="" @load="imageLoad">
1
2
1
2
使用imageLoad这个方法把这个事件传给我们的首页(Home)大组件
methods: {
imageLoad(){
this.$bus.$emit('itemImageLoad')
}
}
1
2
3
4
5
1
2
3
4
5
在home.vue中接收这个事件
// 3.监听item中加载事件
this.$bus.$on('itemImageLoad',()=>{
this.$refs.scroll.refresh();
})
1
2
3
4
1
2
3
4
这里面有两个地方,
一是我们自己定义的原型bus。也称事件总线是在main.js中定义的一个vue实例
Vue.prototype.$bus =new Vue()
1
2
1
2
只有把它定义成vue实例才可以通过子组件向父组件发送事件
二在scroll组件中是封装refresh方法,就不用了多次调用scroll了
refresh(){
this.scroll.refresh()
}
1
2
3
1
2
3
最后就不会出现滚不动的bug了