人人做人人干-人人做人人看-人人做人人爽国产视-人人做人人爽人人爱-色屋视频-色屋网

歡迎您光臨深圳塔燈網絡科技有限公司!
電話圖標 余先生:13699882642

網站百科

為您解碼網站建設的點點滴滴

小程序技能進階回憶錄 - 自主實現數據偵聽器和計算器

發表日期:2019-11 文章編輯:小燈 瀏覽次數:5077

告訴元首我已盡力,告訴父親我仍然愛他!

熟悉 Vue 的同學對 computedwatch 一定很熟悉,這些特性大大方便了我們對代碼中的數據進行處理:

var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // 計算屬性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 實例
      return this.message.split('').reverse().join('')
    }
  }
})
var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})

這是 Vue 官網中兩段代碼。

官方實現

如今小程序也有了自己的實現,詳見官方文檔 observer 。小程序官方 github
中也開源了通過 Behaviors 實現的 Vue 風格的computedwatchhttps://github.com/wechat-miniprogram/computed

那么在微信沒有提供這些方法之前,如何自主實現數據的偵聽器和計算屬性呢?

## 自主實現

先看看定義的使用文檔:

Page({
 data: {
   list: [],
   list2: [],
   size: 0
 },
 // 偵聽器函數名必須跟需要被偵聽的 data 對象中的屬性同名,
 // 其參數中的 newValue 為屬性改變后的新值,oldValue 為改變前的舊值
 watch: {
   // 如果 `list` 發生改變,這個函數就會運行
   list(newValue, oldValue) {
     console.log(oldValue + '=>' + newValue)
   }
 },
 // 傳入的參數list必須是 data 里面的屬性
 // 這里可以傳入多個 data 屬性
 computed({
   list,
   list2
 }) {
   return {
     size: list.length,
     size2: list2.length
   }
 }
})

Page 的傳參中多了兩個熟悉的屬性,用法不用解釋太多。需要繼續對小程序提供的 Page 方法進行改造,此外,因為所有數據變化都會用到 setData 方法去觸發,所以還需要改造這個方法。

改造 Page 和 setData

想要基于原有的 setData 進行封裝,那就得先得到這個函數緩存下來(像是緩存原有的 Page 一樣)。想到 onLoad 是小程序頁面的第一個生命周期函數,可以在這里進行操作:

// 緩存原有的 `Page`
let originPage = Page

// 定義新的 Page
function MyPage(config) {
  let that = this
  this.watch = config.watch
  this.computed = config.computed
  this.lifetimeBackup = {
    onLoad: config.onLoad
  }
  config.onLoad = function(options) {
    // 緩存下原有的 `setData`
    this._setData = this.setData.bind(this)
    this.setData = (data) => {
      // 偵聽器
      that.watching(data)
      // 計算器
      let newData = that.getComputedData(data)
      this._setData(extend(data, newData))
    }
    // 備份下頁面實例
    that.context = this
    // 執行真正的 `onLoad`
    this.lifetimeBackup.onLoad.call(this, options)
  }
  
  // ...

  originPage(config)
}

MyPage.prototype.watching = funtion(data) {
  // 執行偵聽器
  // ...
}

// 計算器
MyPage.prototype.getComputedData = function(data) {
  // 開始生成新的數據
  // ...
}

function page (config) {
  return new MyPage(config)
}

大致代碼如上,重新定義了 this.setData,備份了原有的 setDatathis._setData。當然,這里只考慮了 setData 傳一個參數的情況,多個參數需要再對代碼優化下。

注意:調用 watchingcreateNewData 的對象是 that,因為 this 指向小程序頁面實例,沒有自定的這個方法。

做完上述改造,后續的 watchcomputed 就簡單多了。

偵聽器 watch

MyPage.prototype.watching = function(data) {
  var context = this.context
  var oldData = context.data
  // 開始生成新的數據
  var watch = this.watch
  if (watch) {
    Object.keys(watch).forEach(function (k) {
      // 如果新的 data 中屬性被偵聽,執行偵聽函數
      if (k in data) {
        var newValue = data[k]
        var oldValue = oldData[k]
        watch[k].apply(context, [
          newValue,
          oldValue
        ])
      }
    })
  }
}

簡易的偵聽器就寫好了,通過 setData 觸發自定的 watch 中的偵聽函數。

計算器 computed

MyPage.prototype.getComputedData = function(data) {
  var context = this.context
  var computed = this.computed
  var computedData
  if (computed) {
    computedData = computed.call(context, data)
  }
  return computedData
}

這樣就得到了計算后的新生成的數據:computedData

總結

不斷的通過備份、代理微信原有的方法,自主實現了簡單的偵聽器和計算器。當然這些代碼只是為了方便分享提取出來了提供思路,實際業務中遇到情況復雜的多,代碼量遠遠也不止這些。


本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://www.kwpm.com.cn/25244.html
相關小程序
 八年  行業經驗

多一份參考,總有益處

聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

咨詢相關問題或預約面談,可以通過以下方式與我們聯系

業務熱線:余經理:13699882642

Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

主站蜘蛛池模板: 视频一区 欧美 | 中国国产一国产一级毛片视频 | 一区在线免费观看 | 天堂中文在线免费观看 | 免费观看视频成人国产 | 97碰视频人人做人人爱欧美 | 午夜在线网站 | 亚洲欧美日韩中文在线制服 | 怡红院免费全部视频在线视频 | 中文成人在线 | 精品国产免费第一区二区 | 狠狠躁夜夜躁人人躁婷婷视频 | 久久精选视频 | 欧美成人剧情中文字幕 | 日韩精品国产自在久久现线拍 | 国产成在线观看免费视频 | 久久www免费人成看片色多多 | 日韩精品一区二区三区国语自制 | 五月婷婷开心网 | 免费毛片视频网站 | 久久精品九九 | 免费人成在线蜜桃视频 | 久久久一本 | 在线观看黄色毛片 | 国产一区二区免费视频 | 日韩综合在线观看 | 曰皮全部过程视频免费国产 | 国产黄色一级片 | 最近最新中文字幕高清免费 | 中文字幕禁忌乱偷在线 | 久久久96 | 国产欧美视频在线观看 | 欧美理论在线观看 | 美女黄色毛片 | 黄色大片在线免费观看 | 91精品在线观看视频 | 欧美一级手机免费观看片 | 成人福利小视频 | 热re91久久精品国产91热 | 午夜精品影院 | 人人爱天天做夜夜爽2020麻豆 |