微信小程序 數(shù)據(jù)與界面渲染異步問題解決:數(shù)據(jù)監(jiān)聽事件

界面渲染在數(shù)據(jù)加載之前,出現(xiàn)優(yōu)先渲染界面,而數(shù)據(jù)加載完后,界面不再渲染。
通過數(shù)據(jù)監(jiān)聽事件,當(dāng)data中數(shù)據(jù)被改變時,進(jìn)行監(jiān)聽,并進(jìn)行數(shù)據(jù)渲染。

swatch事件監(jiān)聽

新建一個swatch.js的工具類,源碼如下:

// watch.js
 
const observe = (obj, key, watchFun, deep, page) => {
    let oldVal = obj[key]
    // 如果監(jiān)聽對象是object類型并且指定deep(深度監(jiān)聽)
    if (oldVal !== null && typeof oldVal === 'object' && deep) {
      // 遞歸子集,依次執(zhí)行observe()
      Object.keys(oldVal).forEach(item => {
        observe(oldVal, item, watchFun, deep, page)
      })
    }
    // 使用Object.defineProperty()劫持?jǐn)?shù)據(jù)的寫操作,在監(jiān)聽對象改變后執(zhí)行傳入的watchFun
    Object.defineProperty(obj, key, {
      configurable: true,
      enumerable: true,
      set(value) {
        if (value === oldVal) return
        watchFun.call(page, value, oldVal)
        oldVal = value
      },
      get() {
        return oldVal
      }
    })
  }
   
  export const setWatcher = (page) => {
    // 頁面里的data字段
    const data = page.data
    // 頁面里的watch字段
    const watch = page.watch
    // 對watch里列舉的每一個字段(需要監(jiān)聽的字段)執(zhí)行observe()
    Object.keys(watch).forEach(key => {
      let targetData = data
      const targetKey = key
      // 支持deep深度監(jiān)聽,使用deep時需要配合handler使用,否則直接編寫函數(shù)
      const watchFun = watch[key].handler || watch[key]
      const deep = watch[key].deep
      observe(targetData, targetKey, watchFun, deep, page)
    })
  }

在需要進(jìn)行渲染的界面,進(jìn)行數(shù)據(jù)監(jiān)聽

import {setWatcher} from '../../utils/watch.js'
onLoad(){
        setWatcher(this)
 },
watch: {
        shuju(val) {
           console.log('數(shù)據(jù)改變了')
        }
    },
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容