小程序setData數據量過大時候會對渲染有影響嗎?


datas:[
 {
 id:1000,
 name: "帥哥",
 title: '...',
 b: '...',
 d: 0,
 f:0,
 ....
 },
 {
 id:1001,
 name: "美女",
 title: '...',
 b: '...',
 d: 0,
 f:0,
 ....
 },
 ...
]

如上:后台返回數據中有可能包含了大量的無用數據,數據量如果過大時候會對小程序渲染界面有影響嗎?

答案是:

一般情況下我們是在wxml中循環data,然后取出我們需要的字段,其他數據和我們無關。但是小程序文檔中有這么一段話:

setData 是小程序開發中使用最頻繁的接口,也是最容易引發性能問題的接口。在介紹常見的錯誤用法前,先簡單介紹一下 setData 背后的工作原理。

工作原理

小程序的視圖層目前使用 WebView 作為渲染載體,而邏輯層是由獨立的 JavascriptCore 作為運行環境。在架構上,WebView 和 JavascriptCore 都是獨立的模塊,並不具備數據直接共享的通道。當前,視圖層和邏輯層的數據傳輸,實際上通過兩邊提供的 evaluateJavascript 所實現。即用戶傳輸的數據,需要將其轉換為字符串形式傳遞,同時把轉換后的數據內容拼接成一份 JS 腳本,再通過執行 JS 腳本的形式傳遞到兩邊獨立環境。

而 evaluateJavascript 的執行會受很多方面的影響,數據到達視圖層並不是實時的。

其實就是我們setData里面的所有數據都被轉成了字符串,然后字符串又轉換成JS腳本,然后頁面根據JS腳本去渲染頁面。那么我們能做的就是盡量少傳數據,而此時后台返回這一大串數據就與此相悖了,所以最好是新建一個tempData,將要的數據取出來之后再setDta這個tempData,以此來提高微信小程序的頁面渲染速度,提升微信小程序運行效率,優化微信小程序的用戶體驗。

可以這樣寫:

let tempData = []
for(let i = 0; i < datas.length; i++) {
    let tempObj = {
        id: datas[i].id,
      name: datas[i].name
    }
    tempData.push(tempObj)
}
console.log(tempData)

也可以使用高階函數map:

let tempDatas = datas.map(data => {
    return {
        id: data.id,
        name: data.name 
    } 
})
console.log(tempDatas)

此時我們再使用setData({})就能提高渲染效率了

同時再分享兩個setData技巧

1、有一個Object如下:

obj: {
    a: "a",
    b: "b",
    c: "c"
}

此時已經渲染到頁面了,然后我們修改了obj,此時可以選擇:

① 平時做法:

let obj = this.data.obj
obj.b = "我是后來修改的"
this.setData({
    obj: obj
})

② 但是更優化的做法是

this.setData({
    'obj.b': "我是后來修改的"
})

不僅省了兩行代碼,同時還提高頁面渲染效率

2、和 1 差不多,就是Object變成數組Array,當我們要給數組的其中一個數據進行修改時,我們可以參照上面的方法

this.setData({
    'array[1]': "我是后來修改的"
})

當我們要給數組的多個數據進行修改時,我們會寫一個循環,然后修改array,此時是無法識別的,要寫成如下形式

for(let i = 0; i < 5; i++) { 
    this.setData({
        [`array[${i}]`]: "我是后來修改的" 
    })
}

 原文地址:https://blog.csdn.net/rolan1993/article/details/81738613


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM