1. 为什么我们需要自定义下拉刷新?
做微信小程序开发的朋友,估计都遇到过这样的场景:你的页面设计了好几个tab,比如一个电商订单页面,分了“全部”、“待付款”、“待发货”、“待收货”几个分类。用户在这些tab之间切换时,数据是独立的列表。这时候,你想给每个tab都加上下拉刷新功能,让用户在当前浏览的位置就能刷新数据,而不是非得滑到整个页面的最顶部。
如果你直接用微信小程序自带的页面级下拉刷新,就会遇到一个很尴尬的问题。你需要在页面的.json文件里设置"enablePullDownRefresh": true,然后在页面的js里写onPullDownRefresh函数。这个方法确实简单,但它有个硬伤:下拉刷新的动画和触发区域,永远只在页面的最顶端。这意味着,当用户已经滑动到屏幕中间,在看“待发货”的订单列表时,他必须先把列表使劲往上划,一直划到整个页面的最顶部,那个默认的“三个点”动画才会出现。这个体验非常割裂,用户会觉得莫名其妙,我明明只想刷新当前看到的这个列表,为什么非要我回到山顶?
这就是scroll-view组件搭配自定义下拉刷新大显身手的时候了。scroll-view本身是一个可滚动的视图区域,它最厉害的一点就是可以把它理解成一个“容器”,这个容器内部的滚动和交互是独立的。我们可以给这个容器单独开启下拉刷新功能,并且这个功能只在这个容器内部生效。这样一来,无论你把scroll-view放在页面的哪个位置——是顶部,是中间,还是配合tab切换——用户只要在这个容器里下拉,就能触发刷新,体验上就自然多了。
我做过好几个需要复杂列表交互的项目,一开始图省事用了页面级下拉刷新,结果被测试和产品经理追着问“为什么刷新这么麻烦”。后来全面转向scroll-view自定义方案,不仅解决了痛点,还能做出更酷炫的刷新动画,比如放个公司Logo,或者做个品牌特色的加载图标,灵活性大大提升。所以,如果你的小程序里有类似多tab列表、嵌套滚动区域的需求,别再死磕系统自带的下拉刷新了,scroll-view的自定义方案才是正解。
2. 核心武器:scroll-view的刷新属性全解析
要用好自定义下拉刷新,你得先把你手里的“武器”——也就是scroll-view的那些相关属性——摸得门儿清。微信官方从基础库2.10.1版本开始,为scroll-view增加了一整套关于自定义下拉刷新的属性,我们一个个来看,它们分别管什么事。
refresher-enabled:这是总开关。 它的类型是布尔值,默认是false。你必须把它设为true,才能开启scroll-view内部的自定义下拉刷新功能。记住,这个功能和页面级的enablePullDownRefresh是互斥的,用了这个,通常就不需要开页面级的了。
refresher-threshold:决定“下拉多少距离才算数”。 类型是数字,默认值是45,单位是像素(px)。这个值的意思是,用户需要把你的scroll-view容器向下拉超过45px,系统才会认为“哦,用户是想刷新了”,从而触发刷新事件。你可以根据设计稿调整这个值。比如你觉得默认的有点太灵敏,想让用户拉得更用力一点才刷新,就可以把它设为80或者100。
refresher-default-style:设置默认的加载动画样式。 类型是字符串,可选值有三个:"black"、"white"、"none"。black和white就是微信那个经典的三个点动画,只是颜色不同。如果你选择none,那就意味着“我不想要系统自带的那个三个点动画,我要完全自己画一个”。当你打算深度自定义动画效果时,就选这个。
refresher-background:设置下拉刷新区域背后的颜色。 类型是字符串,默认是"#FFF"(白色)。这个区域就是用户下拉时,scroll-view顶部露出来的那一块背景。你可以把它设置成和你的页面背景一致,以达到视觉上融为一体的效果。
refresher-triggered:这是整个刷新过程的“状态控制器”。 类型是布尔值,默认是false。这个属性是双向绑定的关键。当用户下拉距离超过阈值,系统会自动将它设为true,此时刷新动画会保持展开状态(比如显示“加载中…”)。然后,你需要在自己的业务逻辑里(比如数据请求成功后),手动将它设回false,刷新动画才会收起,页面恢复正常滚动。你通过setData控制它,就控制了刷新动画的“收”与“放”。
光有属性还不够,还得有事件来告诉我们“什么时候发生了什么”。scroll-view提供了四个关键事件:
bindrefresherpulling:正在下拉,但还没达到触发阈值。你可以在这里根据下拉距离,实时更新一些自定义的动画状态(比如旋转一个图标的角度)。bindrefresherrefresh:最重要的事件。当下拉距离超过阈值并松手时触发。你99%的刷新业务逻辑(比如发起网络请求加载新数据)都应该写在这个事件的回调函数里。bindrefresherrestore:刷新完成后,刷新头复位(收起)时触发。bindrefresherabort:下拉刷新被中途中止时触发(比如下拉过程中突然横向滑动了一下)。
理解这些属性和事件各自的分工,是写出稳定可靠的自定义刷新功能的

1518

被折叠的 条评论
为什么被折叠?



