一、setData
小程序頁面加載渲染時是通過獲取js文件中Page里面初始化數據data來進行渲染。
js:
/**
* 頁面的初始數據
*/
data: {
name:'張三',
},
wxml:
<text>{{name}}</text>
結果:
完成渲染后,直接通過賦值是無法改變頁面中所顯示的數據,只能通過setData來改變(每次最多只能改變1M數據)。
如果通過直接賦值,如:this.data.name = '李四' ,是無法改變頁面的顯示,還會造成視圖層和數據層數據不一致。
在js中onLoad函數中運行this.data.name = '李四'
onLoad: function(options) {
this.data.name = '李四'; // 運行該命令修改data.name
},
結果無法改變視圖顯示
正確改變頁面顯示的做法:
js:
運行setData前頁面初始化時的數據:
/**
* 頁面的初始數據
*/
data: {
name: '張三',
age: 17,
},
運用setData后:
this.setData({
name:'李四',
age:18
})
結果:

二、setData運用場景和方法
只要需要改變頁面顯示都需要運用setData (請求數據wx.request 后、 交互后 需要改變頁面顯示都需要通過setData 來改變)
1、改變對象某個屬性
this.setData({
['info.name']: '李四', // 此時屬性名需要用字符串
['info.age']: 18
})
2、改變數組某個元素或對象屬性
為了不影響性能不建議一次性更新整個數組(如果數組數據太大),應該只更新某個元素。
確定改變某個元素:
let str =`lists[2].name`; // 此時屬性名需要用字符串
this.setData({
[str]:李四,
})
不確定改變的是哪個元素(交互時,用戶點擊數組的某個元素對應改變顯示內容):
用戶點擊時可以把所點擊的下標傳回進行對應的更改;
click(i){
let index=1;
let str = `lists[${index}].name`;// 此時屬性名需要用字符串
this.setData({
[str]:'李四',
})
}
3、分頁(適用於上拉加載更多)
分頁為了避免一次性更新太多數據,建議把數據設計成二維數組如下:
通過wx:if來渲染。
每次加載新頁面時在users后面新添加一頁數據即可
users: [
[{name: '張三',age: 17}, {name: '張三',age: 17}], // 第一頁數據
[{name: '張三',age: 17}, {name: '張三',age: 17}] // 第二頁數據
。。。。
[{name: '張三',age: 17}, {name: '張三',age: 17}] // 第n頁數據
]
let str = `users[${page}]`;
let datas=[{name: '張三',age: 17}, {name: '張三',age: 17}]; // 第n頁數據
this.setData({
[str]:datas
})
wxml:
<block wx:for="{{users}}">
<view wx:for="{{item}}" wx:for-item="userItem">
<text>{{userItem.name}}</text>
<text>{{userItem.name}}</text>
</view>
</block>
以上是本人初學小程序的筆記,如有錯誤請指出
