我們的功能裡面有個滾動到底部載入的功能,優化前我們的做法是這樣的
//1: 初始乙個list,儲存列表資料我估計大部分人面對長列表滾動的時候,一開始的處理方式都是這樣的,如果資料不多,只有幾頁可能不會太暴露問題,如果頁數過多,幾十頁甚至上百頁的情況,list的資料會越來越大,每次setdata的資料就會越來越多,因而每次頁面重新渲染的節點就會越來越多,從而導致滾動到後面,載入越來越慢。另外,由於小程式的檢視渲染層和資料邏輯處理層是分開的,不是在同乙個執行緒上面的,從使用者觸發頁面互動,到處理資料邏輯,最後層現頁面,資料到檢視是需要傳輸的,因而小程式本身對資料大小也有限制,不能超過1m。data =startlist
//2: 監聽滾動事件,滾動到底部獲取新資料,並追加到list尾部,最後重新setdata
onreachbottom:()=> = this
.data
fetchnewdata().then((res)=>)}}
怎麼解決呢?小程式setdata裡面的key支援資料路徑的寫法,比如
let o =obj;所以我們可以通過資料路徑的寫法,來將資料分批的傳輸到檢視層中,減少一次性setdata的資料大小。具體寫法如下this
.setdata()
或者let a =array;
this
.setdata()
//這個應該好理解,就是渲染頁面時,一次性傳送了過多的請求,導致了同一時間發起了過多的http請求,http連線是非常耗時的,尤其是一次性發起這麼多,並且一次性發起的http鏈結也是有限制的,比如chrome瀏覽器就限制一次性最多6個。1.通過乙個二維陣列來儲存資料
let feedlist =[[array]];
//2.維護乙個頁面變數值,載入完一次資料page++
let page = 1
//3.頁面每次滾動到底部,通過資料路徑更新資料
onreachbottom:()=>)
}}//
4.最終我們的資料是[[array1],[array2]]這樣的格式,然後通過wx:for遍歷渲染資料
所以在渲染頁面時,不在檢視範圍內的我們不載入,只有元素出現在檢視範圍內了,再渲染。
常規的做法是,通過getboundingclientrect()
獲取元素的位置,然後與頁面滾動位置比較,如果出現在檢視內,就將img
顯示。這種方式有2個問題
intersectionobserver 物件,用於推斷某些節點是否可以被使用者看見、有多大比例可以被使用者看見通過這個api我們不用再主動去監聽元素位置了,在頁面渲染一開始,通過這個api指明需要監聽的元素,系統會自動去監聽了元素位置。
let data =list;intersectionratio值大於0,說明元素出現在檢視中了,重新setdata資料,顯示元件。img-}
" wx:for="
}">
data.foreach((item,index)=>`,res=>)}})
})
這個問題就是指尺寸太大了,而頁面上我們顯示的尺寸又太小了,尺寸大,請求就越慢,導致頁面渲染速度下降。
對於頁面裡面的,最好都把儲存在cdn伺服器上,乙個是能充分利用cdn快取來加快請求速度,另外乙個就是cdn上能夠將進行一定的處理,比如裁剪。我司就是通過cdn來響應處理,然後請求時告訴cdn伺服器需要什麼要的尺寸,由cdn伺服器響應對應尺寸。
key值在列表渲染的時候,能夠提公升列表渲染效能,為什麼呢?首先得想想小程式的頁面是如何渲染的,主要分為以下幾步:
將wxml結構的文件構建成乙個vdom虛擬數
頁面有新的互動,產生新的vdom數,然後與舊數進行比較,看**有變化了,做對應的修改(刪除、移動、更新值)等操作
最後再將vdom渲染成真實的頁面結構
key值的作用就在第二步,當資料改變觸發渲染層重新渲染的時候,會校正帶有 key 的元件,框架會確保他們被重新排序,而不是重新建立,以確保使元件保持自身的狀態,並且提高列表渲染時的效率。
key值如果不指明,缺省會按陣列的索引來處理,因而會導致一些類似input等輸入框元件的值出現混亂的問題。
相關測試**可以檢視:wxkey
可以看到
因而,在做list渲染時,如果list的順序發生變化時,最好增加key,且不要簡單的使用陣列索引當做key。
最後看看我們的成果:
小程式列表倒計時
適合拼團用的倒計時 通過後端傳過來的資料,前端進行處理轉換 js data getpink function then function res var pinkentitylist res.data.pinkentitylist 請求到的資料 var newpin 定義新陣列接受資料 var in...
微信小程式 列表渲染wx for
在元件上使用wx for控制屬性繫結乙個陣列,即可使用陣列中各項的資料重複渲染該元件。預設陣列的當前項的下標變數名預設為index,陣列當前項的變數名預設為item view wx for view page 使用wx for item可以指定陣列當前元素的變數名,使用wx for index可以指...
5 微信小程式 列表渲染 wx for
在元件上使用wx for控制屬性繫結乙個陣列,即可使用陣列中各項的資料重複渲染該元件。預設陣列的當前項的下標變數名預設為index,陣列當前項的變數名預設為item for page 使用wx for item可以指定陣列當前元素的變數名,使用wx for index可以指定陣列當前下標的變數名 f...