美团、饿了么外卖点菜界面联动菜单性能优化
2019-01-24 20:47
609 查看
1. 业务逻辑描述
2. 优化后的性能提升对比
相当明显
3. 常规处理逻辑
把左侧菜单的一项成为分类(category),
把右侧每一项称为项(item)。
- DOM更新后,获取整个content的高度(包裹所有item的盒子的高度);
- 获取每个category在content上的高度,从而获取跳转y值区间数组
jumpArr
; - 在content上监听滑动事件,判断当前
y
值在jumpArr
中的位置,更新左侧category样式。
这种方法处理的问题(性能上的)
每次触发scroll事件后都会遍历数组jumpArr
来判断此刻左侧导航该有的样式。scroll事件的触发是相当密集的,也就是jumpArr
的遍历也是相当密集。对性能有很大的影响。特别是当应用越来越大时、设备比较老旧时。
4. 我的优化思路
- 标题2中的1、2步保持不变,通过相同的方法获得
jumpArr
; - 上面步骤3采用的是实时遍历,现在抛弃这种做法。而是,生产一个跳转函数,可以使用
if...else
也可以使用switch...case
,这里选用后者,因为性能更加出众。
注:生成的jumpFunc
是字符串,需要使用eval()
来进行函数转换。
5. 代码示例(vue)
- 计算获取
jumpArr
getGoodsHeight() { //这两项是用来获取content总高的 const specials = document.querySelector(".specials"); const itemList = document.querySelectorAll(".group-item"); //预赛了 let heightList = []; heightList.push(specials.offsetHeight); itemList.forEach((element, index) => { const eleHeight = element.offsetHeight; const preheight = heightList[index]; heightList.push(preheight + eleHeight); }); this.heightList = heightList; }
- 根据
jumpArr
得出用于逻辑处理的跳转函数jumpFunc
getJumpFunc() { //这样的写法有助于性能,使用判断而不是用循环 let i = 0; let func = `(function () { return function (y, context) {`; const length = this.heightList.length; while (i < length) { const current = this.heightList[i - 1] || 0; const next = this.heightList[i]; const lastIndex = length - 1; let partition = ""; switch (i) { case 0: partition = `if(y > 0 && y< ${next}) { context.addNavStyle(${i}) }`; break; case lastIndex: partition = `else { context.addNavStyle(${i}) }};})();`; break; default: partition = `else if (y > ${current} && y <${next}) { context.addNavStyle(${i}) }`; break; } func += partition; i++; } return eval(func); },
- 项目地址
相关文章推荐
- 仿百度外卖、美团外卖、淘点点等左右联动ListView菜单展示
- Android性能优化之界面UI篇
- 美团外卖我的信息界面实现
- Android界面性能分析及优化
- 携程移动端 UI 界面性能优化实践
- 美团点评 spark性能优化指南-基础篇
- Android性能优化记录之界面渲染优化
- Android界面性能优化
- iOS--性能优化--保持界面流畅
- Android性能优化——界面流畅度优化
- Linux性能优化——RedHat7 图形界面与文本界面
- 美团点评 spark性能优化指南-高级篇
- ionic——性能优化【界面缓存清理】
- seeting菜单界面形成--优化
- Spark性能优化指南——高级篇 (转自美团)
- 性能优化模式-美团技术团队
- 利用二叉树特性优化省市镇三级联动性能
- Android界面性能优化必读
- iOS 保持界面流畅性能优化
- iOS 类似美团外卖 app 两个 tableView 联动效果实现