近期我在進行微信小程序開發的時候,遇到了一個函數需要多次 setData
在 setData
進行完畢后,通過 console.log( this )
來查看數據,發現數據是已經更新成功了
但是頁面卻沒有渲染出結果來
因此推測可能是因為多次執行 setData
,加上本身執行的操作比較復雜,導致小程序頁面沒能反應過來。
解決方法
后來通過定義一個對象,把所有要 setData
的數據都存放進對象里面,等執行的差不多的時候再一次性通過 setData
方法把數據更新過去
let setData: any = {} // 這個就是存放將要 setData 數據的對象
let start_time = ""
let end_time = ""
// 判斷開始和結束顯示的時間
if (s_hour >= 0 && s_hour < 6) {
start_time = '0:00'
s_hour_head = '00:00:00'
} else if (s_hour >= 6 && s_hour < 12) {
start_time = '6:00'
s_hour_head = '06:00:00'
} else if (s_hour >= 12 && s_hour < 18) {
start_time = '12:00'
s_hour_head = '12:00:00'
} else if (s_hour >= 18 && s_hour < 24) {
start_time = '18:00'
s_hour_head = '18:00:00'
}
if (e_hour >= 0 && e_hour < 6) {
end_time = '6:00'
} else if (e_hour >= 6 && e_hour < 12) {
end_time = '12:00'
} else if (e_hour >= 12 && e_hour < 18) {
end_time = '18:00'
} else if (e_hour >= 18 && e_hour < 24) {
end_time = '0:00'
}
/**
* 計算灰色進度條的長度
* 6 個小時的間距,時間戳為 21600000
* 因此灰色進度條的區間一定是 21600000 的倍數
* 用 dur_time / 21600000 並向上取整即可
*/
// 計算灰色進度條開始的時間戳
let s_hour_head_tmp = new Date(new Date(this.start_task_time).toLocaleDateString().replace(/\//g, '-') + ' ' + s_hour_head).valueOf()
// 計算灰色進度條的總長度
let total_dur_time = Math.ceil(dur_time / 21600000) * 21600000
// 計算橙色進度條開始的時間戳
let s_hour_det_tmp = new Date(this.start_task_time).valueOf()
/** 這里把所有要設置的數據放進 setData 對象里面 */
setData['task.task_detail.start_time'] = start_time
setData['task.task_detail.end_time'] = end_time
setData["time_progress_width"] = Math.ceil(dur_time / total_dur_time)
setData["time_progress_left"] = (s_hour_det_tmp - s_hour_head_tmp) / total_dur_time * 100
// 最后一起把數據一次性 setData 進去
this.setData(setData)