記憶體不足起因
小程式對使用者記憶體使用進行了限制,如果一個頁面的圖片過多,會導致記憶體不足的內部錯誤
解決辦法
對圖片進行懶載入,不影響體驗的前提下,只渲染當屏的圖片,屏外圖片,顯示預設圖
實踐分析
-
圖片最多的情況就是列表(頭圖或圖片列表),為了效能,一般會滾動載入,而在小程式中,需要藉助scroll-view/swiper元件,為了不影響使用者體驗,就不能讓之前以渲染的列表元素失去佔位
-
要判斷元素是否在當屏,就要知道一些高度資訊(螢幕高,滾動高度,元素高度),但是元素高度在小程式中不能動態獲取,所以就需要列表時定高的
程式碼
wxml檔案
<!--
showIndex為當屏中首列表元素的索引值
scrollLoad滾動載入
scrollHide圖片當屏渲染
-->
<scroll-view wx:if="{{isNet}}" scroll-y="true"
bindscrolltolower="scrollLoad" bindscroll="scrollHide">
<view wx:if="{{total}}">
<block wx:for="{{imgDatas}}">
<view>
<image wx:if="{{showIndex + 24 > index && showIndex - 6 < index}}" src="{{item.pic.url}}" mode="aspectFill"></image>
</view>
</block>
</view>
</scroll-view>
計算showIndex的方法,可作為公用方法
/**
* offetHeight 滾動計算部分到頂部距離
* scrollTop 滾動高度
* height 每個模組的高度
* colunm 列數
**/
function countIndex (offetHight, scrollTop, height, colunm) {
// 單例獲取螢幕寬度比
if (!countIndex.pix) {
try {
let res = wx.getSystemInfoSync()
countIndex.pix = res.windowWidth / 375
} catch (e) {
countIndex.pix = 1
}
}
let scroll = scrollTop - offetHight * countIndex.pix
let hei = height * countIndex.pix
return scroll > 0 ? Math.floor(scroll / hei) * colunm : 0
}
js檔案
let wxTools = require(`../../untils/wxTools.js`)
Page({
data: {
scrollData: {
offetHeight: 15, // px
height: 80, // px
colunm: 3
},
showIndex: 0
},
scrollHide (e) {
let data = [
this.data.scrollData.offetHeight,
e.detail.scrollTop,
this.data.scrollData.height,
this.data.scrollData.colunm
]
let index = wxTools.countIndex(...data)
this.setData({
showIndex: index
})
}
})
具體要渲染多少的元素,自己來定,這裡沒有放到countIndex中加入計算,例如wxml中的{{showIndex + 24 > index && showIndex – 6 < index}},會渲染30個元素的圖片