weex scroller滚动的小烦恼

简介: ### 【背景】 *** 前几天的需求开发中,需要完成这样一个功能: *** 这还不简单?一个横向滚动的tag选择功能。一个横向scroller搞定问题。 但是做为一个对自己有“要求”的程序员,怎么可能会接受一个死气沉沉的滚动条。为了勾起用户的点击欲望,我毫不犹豫的增加了一个点击tag以后,tag自动移动到屏幕左侧位置的动画(如果内容不够,就不滚动)。看着流畅

【背景】


前几天的需求开发中,需要完成这样一个功能:

TB1W64Yb3oQMeJjy0FpXXcTxpXa-762-756.png


这还不简单?一个横向滚动的tag选择功能。一个横向scroller搞定问题。

但是做为一个对自己有“要求”的程序员,怎么可能会接受一个死气沉沉的滚动条。为了勾起用户的点击欲望,我毫不犹豫的增加了一个点击tag以后,tag自动移动到屏幕左侧位置的动画(如果内容不够,就不滚动)。看着流畅的动画,我在内心给自己点了好几个赞(最后一句忽略)。

【问题】


上线当天,测试的一个bug打破了我内心的小平静。在Ios手机上面出现了一个意想不到的问题:内容不够的情况,本不应该滚动的滚动条,奇迹般的滚动了!

期望的效果 实际的样子

最严重的问题是滚过去的tag,再也滚不回来了

【分析】

bug就在眼前,必须搞定!

在正式分析之前为表述方便做两个重要约定:

【重要约定】

scroller内容不足:scroller内部内容长度小于容器长度

scroller内容充足:scroller内部内容长度大于容器长度


scroller内容不足时滚动真有问题么?

老规矩-控制变量法 为了排除自身代码以及飞猪APP的干扰,在dotwe平台上面使用最少的代码实现了一个scroller内容不足 滚动demo。并且用最新的手淘ios版本做了实验。

结果:果然不行。本不应该滚动的scroller还是发生了滚动,并且无法滚动回去。这应该是scroller的bug无疑了。

scroller内容充足时滚动也有同样问题么?

scroller内容充足时滚动采用官方demo来验证。

结果:scroller内容充足的情况下滚动正常。

那么list是ok的么?

老规矩上例子:list内容不足滚动demo

结果:经过测试list确实也发生了滚动,但是滚动以后还是可以正常拉回来。不会出现内容被截断的bug。

问题特征总结

【问题构成因素】

  • 1.scroller内容不足
  • 2.采用如下方式进行滚动

    dom.scrollToElement(first, {offset: 0});
  • 3.在weex的ios平台上

【现象】出现异常滚动。并且滚动以后,会出现内容截断,无法滚动回去。内容足够的情况下没有问题。

【范围】
该bug,仅存在在scroller组件,list组件不存在。

【解决】


思路一: Native发版解决。

这个是最治本的方式,但是发版就在眼前,不可能等到下个版本。在将问题反馈给手淘同学以后,赶快思考绕过的方法。

思路二:增加内容

通过自动增加scroller内容的长度,将原本scroller内容不足编程scroller内容充足。
最自然的思维方式。但是也有很多的局限:

  • 由于tag的长短并不固定,增加内容的长度的计算复杂并且精确度得不到保障
  • 二次数据填充,增加了一次数据绑定,浪费性能。

思路三: 利用appear事件

在整个scroller 内容部分的最后面,增加一个bottom模块。如果scroller渲染完成的时候bottom模块appear,那么意味着内容是满足不了滚动需求的。这时候取消滚动动画。如果是没有appear那么意味着内容比较多可以滚动。
这种思路局限:

  • appear 事件的触发率并不十分理想
  • 需要区分两个状态,一个是第一次渲染完成appear,一个是滚动以后appear。但是这种区分并不容易。需要监听滚动事件。成本相对较高。

思路四: 获取scroller元素中最后一个view在屏幕中的位置

上面的思路都有这样或者那样的局限,有没有更好的方法呢?
其实只要能获取scroller元素中最后一个view在屏幕中的位置,就能判断出当前的scroller中的内容是否能满足滚动要求。问题就迎刃而解了。
在weex官方文档中,dom模块有一个方法

dom.getComponentRect()

通过改方法能获取任一view在屏幕中的位置。那么scroller元素中最后一个view在屏幕中的位置可以获取到么?
答案是可以的:因为scroller中的view并不复用,数据绑定以后,所有的view都已经加载到scroller中。只要在最后一个view上面加上ref的索引,既可获得该view在屏幕中的位置。通过跟scroller容器在屏幕中的区域大小进行比较,就能准确判断出是否满足滚动需求。

//针对我自己的业务需求判断代码如下:(仅供参考)
isCanScroll: function () {
       let that = this;
       dom.getComponentRect(this.$refs.rightBottomCell, option => {
         console.log('getComponentRect:', option);
         let size = option.size;
         if (size) {
           let left = Math.round(size.left);
           if (left > 750) {
             that.isCanScrollFlag = 1;
             that.scrollToLeftOnly();
           }
           else {
             that.isCanScrollFlag = 0;
           }
         }
       });
     }

至此问题圆满解决!

【后续action】

  • 反馈给weex同学,尽快修复改bug
  • 过度阶段,可以采用思路四解决问题
目录
相关文章
|
网络协议 JavaScript 前端开发
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名2
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名
3224 0
|
4月前
|
移动开发 weex Android开发
极致体验无小事:Weex购物车基础优化实践
手机淘宝购物车团队在完成Weex技术升级后,聚焦基础体验精细化治理,覆盖暗黑模式适配、热区对齐、皮肤样式优化、适老化改造与多终端兼容。通过舆情、数据与用户视角三轨驱动,实现从功能交付到体验交付的思维升级,打造更流畅、包容、个性化的购物体验。
|
6月前
|
数据可视化 算法 安全
智能体赋能企业管理:数据驱动决策的治理现代化实践
北京某互联网公司HR每月核算百人绩效耗时3天、准确率仅85%。引入“智能体来了”HR智能系统后,通过API整合Jira、企业微信、CRM数据,采用Drools规则引擎实现考核逻辑可配置,ECharts可视化分析,将核算压缩至2小时,准确率达99%,离职预测准确率82%,助力企业迈向数据驱动管理,符合国家智能化升级与数据安全规范要求。
|
监控 前端开发 安全
谈谈我做 Electron 应用的这一两年
本文首发于微信公众号“前端徐徐”,作者徐徐分享了过去一两年间开发Electron桌面应用的经验与心得。文章详细介绍了从项目启动、技术选型到具体实施的过程,并探讨了桌面端开发面临的挑战及解决方案,如软件更新、任务队列设计、性能优化等。此外,还列举了一些特殊需求的实现方法,如静默安装、进程禁用等。作者认为,尽管桌面端开发有其独特性,但通过不断探索与实践,仍能显著提升用户体验和技术水平。
763 0
谈谈我做 Electron 应用的这一两年
|
JavaScript 前端开发 网络协议
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名3
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名
1052 0
|
网络协议 网络架构
TCP/IP 协议体系结构四层分别是什么?
TCP/IP协议体系结构四层分别是:1、数据链路层;实现网卡接口的网络驱动程序,以处理数据在物理媒介上的传输。2、网络层;实现数据包的选路和转发。3、传输层;为两台主机上的应用程序提供端到端的通信。4、应用层;负责处理应用程序的逻辑。
|
机器学习/深度学习 传感器 数据采集
使用Python实现深度学习模型:智能工业与工业4.0技术
【8月更文挑战第15天】 使用Python实现深度学习模型:智能工业与工业4.0技术
320 0
|
存储 Java 开发工具
如何删除Git仓库中的敏感文件及其历史记录
本文主要介绍如何使用 `git filter-branch` 命令删除 Git 仓库中的敏感文件及其历史记录。在 Git 中,我们通常会将敏感信息(如密码、私钥等)存储在 .gitignore 文件中,以防止这些信息被意外提交到仓库。有时候,因为疏忽或私有仓库转公开仓库,我们可能需要删除某个特定的敏感文件及其历史记录。
1377 0
如何删除Git仓库中的敏感文件及其历史记录
|
Java Unix Linux
M2_HOME还是MAVEN_HOME配置环境变量,有什么区别?
M2_HOME还是MAVEN_HOME配置环境变量,有什么区别?
929 0