微信小程序:setData函數(shù)詳解及注意事項(xiàng)

前言

在微信小程序中經(jīng)常會使用到setData函數(shù)把變量渲染到視圖層粱坤,那么什么是setData呢仑氛?如何使用械荷?注意事項(xiàng)有些什么翠拣?下面我們就來詳細(xì)了解一下角骤!

正文

  • setData是小程序開發(fā)中使用最頻繁的接口,也是最容易引發(fā)性能問題的接口。
  • setData函數(shù)用于將數(shù)據(jù)從邏輯層渲染到視圖層(異步)邦尊,同時改變對應(yīng)的this.data的值(同步)背桐。

實(shí)例1:簡單實(shí)現(xiàn)點(diǎn)擊修改變量值

<text>test:{{test}}</text>
<button bindtap="bindTest">點(diǎn)擊改變test值</button>
Page({
    data: {
        test: "我是測試變量"
    },
    bindTest: function () {
        console.log("this.data.test:" + this.data.test);
        this.setData({
            test: "我是測試變量,我的值被改變了蝉揍!"
        })
        console.log("this.data.test:" + this.data.test);
    }
})

效果:

在這里插入圖片描述

實(shí)例解析:

  • 代碼很容易理解链峭,點(diǎn)擊按鈕test變量的值被改變了,通過setData函數(shù)渲染到了前端展示又沾。
  • 另外我在this.setDta前后分別打印出了this.data.test的值弊仪,看看最終打印結(jié)果:


    在這里插入圖片描述

    這里就說明了setData函數(shù)渲染到視圖層后,會同步修改this.data.test的值杖刷。

實(shí)例2:動態(tài)修改數(shù)組指定下標(biāo)的某個參數(shù)值(類似購物車)

<block wx:for="{{test}}" wx:key="index">
    <view data-index="{{index}}" bindtap="bindTest">{{item.txt}}</view>
</block>
Page({
    data: {
        test: [
            { txt: "我是1號" },
            { txt: "我是2號" },
            { txt: "我是3號" }
        ]
    },
    bindTest: function (e) {
        // 被點(diǎn)擊的view
        let index = e.currentTarget.dataset.index;
        // 根據(jù)index找到test對應(yīng)索引中對應(yīng)要修改的參數(shù)
        let revise = "test[" + index + "].txt";
        this.setData({
            [revise]: "呃励饵,我被人給點(diǎn)了!;肌役听!"
        })
    }
})

效果

在這里插入圖片描述

實(shí)例解析:

  • 其實(shí)這個就是根據(jù)index找到test對應(yīng)索引中對應(yīng)要修改的參數(shù),然后進(jìn)行修改并渲染到頁面上表窘;
  • 該功能購物車選中狀態(tài)典予、數(shù)量更改都可以使用到;
  • 此方法比使用循環(huán)尋找更改然后再渲染乐严,更方便瘤袖、性能更好!

注意事項(xiàng)

1.如果Page對象的data中沒有定義該key昂验,則setData自動創(chuàng)建捂敌;如有則修改data中原變量的值。
2.直接修改this.data既琴,而不調(diào)用this.setData()占婉,是無法改變當(dāng)前頁面的狀態(tài)的,會導(dǎo)致數(shù)據(jù)不一致呛梆。
3.使用this.setData({})時锐涯,注意this指向問題。
4.僅支持可以JSON化的數(shù)據(jù)填物。
5.單次設(shè)置的數(shù)據(jù)不能超過1024KB纹腌,盡量避免一次設(shè)置過多的數(shù)據(jù)。
6.不要把data中的任何一項(xiàng)的value設(shè)為undefined滞磺,否則這一項(xiàng)將不能被設(shè)置升薯,可能會有潛在的問題。

常見的setData操作錯誤(官方文檔)

1.頻繁的去setData
在我們分析過的一些案例里击困,部分小程序會非常頻繁(毫秒級)的去setData涎劈,其導(dǎo)致了兩個后果:

  • Android 下用戶在滑動時會感覺到卡頓广凸,操作反饋延遲嚴(yán)重,因?yàn)?JS 線程一直在編譯執(zhí)行渲染蛛枚,未能及時將用戶操作事件傳遞到邏輯層谅海,邏輯層亦無法及時將操作處理結(jié)果及時傳遞到視圖層;
  • 渲染有出現(xiàn)延時蹦浦,由于 WebView 的 JS 線程一直處于忙碌狀態(tài)扭吁,邏輯層到頁面層的通信耗時上升,視圖層收到的數(shù)據(jù)消息時距離發(fā)出時間已經(jīng)過去了幾百毫秒盲镶,渲染的結(jié)果并不實(shí)時侥袜;

2.每次setData都傳遞大量新數(shù)據(jù)
由setData的底層實(shí)現(xiàn)可知,我們的數(shù)據(jù)傳輸實(shí)際是一次evaluateJavascript腳本過程溉贿,當(dāng)數(shù)據(jù)量過大時會增加腳本的編譯執(zhí)行時間枫吧,占用WebView JS線程。

3.后臺態(tài)頁面進(jìn)行setData
當(dāng)頁面進(jìn)入后臺態(tài)(用戶不可見)宇色,不應(yīng)該繼續(xù)去進(jìn)行setData九杂,后臺態(tài)頁面的渲染用戶是無法感受的,另外后臺態(tài)頁面去setData也會搶占前臺頁面的執(zhí)行代兵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尼酿,一起剝皮案震驚了整個濱河市爷狈,隨后出現(xiàn)的幾起案子植影,更是在濱河造成了極大的恐慌,老刑警劉巖涎永,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件思币,死亡現(xiàn)場離奇詭異,居然都是意外死亡羡微,警方通過查閱死者的電腦和手機(jī)谷饿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妈倔,“玉大人博投,你說我怎么就攤上這事《⒑” “怎么了毅哗?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捧挺。 經(jīng)常有香客問我虑绵,道長,這世上最難降的妖魔是什么闽烙? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任翅睛,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捕发。我一直安慰自己疏旨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布扎酷。 她就那樣靜靜地躺著充石,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霞玄。 梳的紋絲不亂的頭發(fā)上骤铃,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音坷剧,去河邊找鬼惰爬。 笑死,一個胖子當(dāng)著我的面吹牛惫企,可吹牛的內(nèi)容都是我干的撕瞧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狞尔,長吁一口氣:“原來是場噩夢啊……” “哼丛版!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偏序,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤页畦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后研儒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豫缨,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年端朵,在試婚紗的時候發(fā)現(xiàn)自己被綠了好芭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡冲呢,死狀恐怖舍败,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敬拓,我是刑警寧澤邻薯,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站恩尾,受9級特大地震影響弛说,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翰意,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一木人、第九天 我趴在偏房一處隱蔽的房頂上張望信柿。 院中可真熱鬧,春花似錦醒第、人聲如沸渔嚷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽形病。三九已至,卻和暖如春霞幅,著一層夾襖步出監(jiān)牢的瞬間漠吻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工司恳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留途乃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓扔傅,卻偏偏與公主長得像耍共,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子猎塞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354