如何解決快應用頁面滑動卡頓問題
問題現象
頁面一次載入了 100 條資料,頁面滑動出現卡頓。
問題程式碼
<template> <div class="container"> <div class="nav"> <text class="nav-item">list</text> </div> <!-- List --> <list class="list" onclick="listClick" onlongpress="listLongPress" onscrollbottom="scrollbottom" id="list" scrollpage="{{scrollPage}}"> <list-item type="listItem" class="item" onclick="listItemClick" if="{{listData.length>0}}"> <div for="{{listData}}" style="flex-direction:column;"> <text class="txt">{{$item}}--{{$idx}}</text> </div> </list-item> <!-- Loading More --> <list-item type="loadMore" class="load-more" if="{{loadMore}}"> <progress type="circular"></progress> <text>More</text> </list-item> </list> </div> </template> <style> .container{ flex-direction: column; } .list { padding-left: 10px; padding-right: 10px; columns: 1; flex-direction: column; border-color: #FF0000; border-width: 5px; } .item { flex-direction: column; align-items: flex-start; margin-bottom: 15px; border-color: #9400D3; border-width: 5px; margin-right: 20px; background-color: #f76160; } .load-more { justify-content: center; align-items: center; height: 100px; border-color: #bbbbbb; border-bottom-width: 1px; } .btn-little { flex: 1; height: 80px; margin-left: 15px; border-radius: 5px; color: #ffffff; font-size: 30px; text-align: center; background-color: #0faeff; } .nav { padding-left: 60px; padding-right: 60px; padding-bottom: 30px; } .nav-item { flex: 1; padding-bottom: 30px; border-bottom-width: 5px; border-color: #fbf9fe; font-size: 35px; color: #666666; text-align: center; } </style> <script> import prompt from '@system.prompt' export default { data: { componentName: 'list', loadMore: true, listAdd: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'], listData: [], scrollPage: false, }, onInit: function () { this.$page.setTitleBar({ text: 'list' }) for(var index = 0;index < 100;index++){ this.listData[index] = 'A'; } }, scrollbottom: function () { prompt.showToast({ message: 'The list slides to the bottom and starts loading other data.' }) // Load next page var that = this var renderData = [].concat(that.listData, that.listAdd) setTimeout(function () { that.listData = renderData }, 1000) }, // monitoring during sliding scroll: function (e) { let msg = 'scroll' + '.scrollX:' + e.scrollX + ' .scrollY:' + e.scrollY + ' .scrollState:' + e.scrollState console.info(msg) }, listItemClick: function (e) { e.stopPropagation() console.info('List Item is clicked.') prompt.showToast({ message: 'List Item is clicked.' }) }, listClick: function (e) { e.stopPropagation() console.info('List is clicked.') prompt.showToast({ message: 'List is clicked.' }) }, listLongPress: function (e) { e.stopPropagation() console.info('List is long pressed.') prompt.showToast({ message: 'List is long pressed.' }) }, } </script>
問題分析
以上程式碼使用list 、list-item 來載入大規模資料,但是使用方法不當,導致list-item 的檢視view 沒有被複用。
我們知道快應用的引擎是一個android apk ,list 、list-item 的實現最終都是透過android 的ListView 、BaseAdapter 等這些實現的,瞭解這些其實知道列表介面上超過螢幕顯示的區域是不會重新建立檢視的,而是複用第一次在介面上可見區域的那些view 的,只需要把資料重新整理一下即可。每一行的檢視view 其實就是list-item 。
以上程式碼雖然看起來是列表,但是隻有1 個list-item ,開發者在list-item 內部使用了for 迴圈,每迴圈一次,都會建立一個新的view ,當資料量很大時,記憶體佔用越多,手機記憶體吃緊,不斷地做申請、釋放記憶體的操作,應用效能受到嚴重影響,導致滑動卡頓。
解決方法
基於list 元件的特點,在list-item 內部內部需謹慎使用if 指令或for 指令,根據列表每行資料特點,在list-item 上設定不同的type ,儘可能複用list-item ,在list-item 上使用for 語句。修改後程式碼如下( 注意list-item部分):
<template> <div class="container"> <div class="nav"> <text class="nav-item">list</text> </div> <!-- List --> <list class="list" onclick="listClick" onlongpress="listLongPress" onscrollbottom="scrollbottom" id="list" scrollpage="{{scrollPage}}"> <list-item type="listItem" class="item item-color" onclick="listItemClick" for="{{listData}}"> <text class="txt">{{$item}}--{{$idx}}</text> </list-item> <!-- <list-item type="listItem" class="item" onclick="listItemClick" if="{{listData.length>0}}"> <div for="{{listData}}" style="flex-direction:column;"> <text class="txt">{{$item}}--{{$idx}}</text> </div> </list-item> --> <!-- Loading More --> <list-item type="loadMore" class="load-more" if="{{loadMore}}"> <progress type="circular"></progress> <text>More</text> </list-item> </list> </div> </template>
程式碼執行效果圖對比:
圖 1 修改後效果
圖 2 修改前效果
從上面效果圖中我們看到,雖然都是列表資料,但是圖1 每一行都是一個list-item (list-item 的css 中背景色設定的是紅色),而且type 值都一樣,能很好地複用list-item ,但是圖2 中只有1 個list-item ,裡面列表資料都是作為list-item 的子節點。圖2 的效果和使用普通的div 載入大量列表資料是一樣的,根源在於開發者沒有很好地理解list 、list-item 的原理。
欲瞭解更多詳情,請參見:
快應用list 開發指導:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69970551/viewspace-2787085/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iPhone手機卡在載入頁面怎麼辦?如何解決iPhone卡頓問題iPhone
- 蘋果容器超出內容overflow滑動卡頓問題蘋果
- 如何解決快應用堆疊溢位問題
- 移動APP卡頓問題解決實踐APP
- 解決antdesign頁面滑動時下拉框漂浮的問題
- div拖動遇到iframe卡頓的問題解決
- 如何解決網頁無響應問題網頁
- 直播小程式原始碼,小程式頁面左右滑動如何解決原始碼
- 快應用tabs和video元件滑動事件優先順序問題IDE元件事件
- android檢測卡頓問題,recycleview卡頓AndroidView
- 如何解決快取失效問題快取
- HarmonyOS應用框架如何解決多裝置互動問題?框架
- 教你如何解決el-table巢狀el-popover處理卡頓問題巢狀
- 教你嚐鮮「快應用」!體驗秒開,如絲般順滑!
- win10系統下移動滑鼠卡頓如何解決Win10
- 不要在 XML 設定,解決 NestedScrollView 巢狀 RecyclerView 滑動卡頓XMLView巢狀
- 記解決 Postman 卡頓,佔 CUP,卡死問題Postman
- 頁面卡頓的優化–圓角優化
- 因事件堵塞導致頁面卡頓事件
- Performance選項卡筆記以及分析vue頁面卡頓ORM筆記Vue
- 基於vue解決大資料表格卡頓問題Vue大資料
- UIPikerView 省市區三聯滑動,解決滑動崩潰問題UIView
- linux df -h卡頓問題(卡住)Linux
- 快應用入門--頁面佈局篇
- 不完全解決ios瀏覽器頁面滾動到底部或頂部後導致頁面區域性滑動失效的問題iOS瀏覽器
- K8S下應用異常卡頓問題的分析與學習K8S
- 解決WordPress頁面錯位問題的實用技巧
- 【slam】解決VirtualBox執行ubuntu18.04.6卡頓的問題SLAMUbuntu
- Win10系統玩NBA 2k14畫面卡頓如何解決Win10
- WPF頻繁更新UI卡頓問題UI
- 單頁面應用和多頁面應用
- 快應用稽核常見問題
- vue 介面在蘋果手機上滑動點選事件等卡頓解決方案Vue蘋果事件
- 關於彈窗的內部滑動穿透底層頁面的滑動的問題穿透
- 【解決方法】正常遊覽Flash頁面,解決主流遊覽器的不支援問題(如Edge,Firefox)Firefox
- win10右鍵卡頓怎麼辦_win10滑鼠右鍵卡頓如何解決Win10
- win10 固態卡頓怎麼辦_win10電腦硬碟卡頓如何解決Win10硬碟
- Win10膝上型電腦外接螢幕介面出現卡頓、掉幀問題如何解決Win10