歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
          電話圖標(biāo) 余先生:13699882642

          網(wǎng)站百科

          為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴

          小程序技能進(jìn)階回憶錄 - 自主實(shí)現(xiàn)數(shù)據(jù)偵聽器和計(jì)算器

          發(fā)表日期:2019-11 文章編輯:小燈 瀏覽次數(shù):4939

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

          熟悉 Vue 的同學(xué)對(duì) computedwatch 一定很熟悉,這些特性大大方便了我們對(duì)代碼中的數(shù)據(jù)進(jìn)行處理:

          var vm = new Vue({
            el: '#example',
            data: {
              message: 'Hello'
            },
            computed: {
              // 計(jì)算屬性的 getter
              reversedMessage: function () {
                // `this` 指向 vm 實(shí)例
                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 官網(wǎng)中兩段代碼。

          官方實(shí)現(xiàn)

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

          那么在微信沒有提供這些方法之前,如何自主實(shí)現(xiàn)數(shù)據(jù)的偵聽器和計(jì)算屬性呢?

          ## 自主實(shí)現(xiàn)

          先看看定義的使用文檔:

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

          Page 的傳參中多了兩個(gè)熟悉的屬性,用法不用解釋太多。需要繼續(xù)對(duì)小程序提供的 Page 方法進(jìn)行改造,此外,因?yàn)樗袛?shù)據(jù)變化都會(huì)用到 setData 方法去觸發(fā),所以還需要改造這個(gè)方法。

          改造 Page 和 setData

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

          // 緩存原有的 `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)
                // 計(jì)算器
                let newData = that.getComputedData(data)
                this._setData(extend(data, newData))
              }
              // 備份下頁面實(shí)例
              that.context = this
              // 執(zhí)行真正的 `onLoad`
              this.lifetimeBackup.onLoad.call(this, options)
            }
            
            // ...
          
            originPage(config)
          }
          
          MyPage.prototype.watching = funtion(data) {
            // 執(zhí)行偵聽器
            // ...
          }
          
          // 計(jì)算器
          MyPage.prototype.getComputedData = function(data) {
            // 開始生成新的數(shù)據(jù)
            // ...
          }
          
          function page (config) {
            return new MyPage(config)
          }

          大致代碼如上,重新定義了 this.setData,備份了原有的 setDatathis._setData。當(dāng)然,這里只考慮了 setData 傳一個(gè)參數(shù)的情況,多個(gè)參數(shù)需要再對(duì)代碼優(yōu)化下。

          注意:調(diào)用 watchingcreateNewData 的對(duì)象是 that,因?yàn)?this 指向小程序頁面實(shí)例,沒有自定的這個(gè)方法。

          做完上述改造,后續(xù)的 watchcomputed 就簡(jiǎn)單多了。

          偵聽器 watch

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

          簡(jiǎn)易的偵聽器就寫好了,通過 setData 觸發(fā)自定的 watch 中的偵聽函數(shù)。

          計(jì)算器 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
          }

          這樣就得到了計(jì)算后的新生成的數(shù)據(jù):computedData

          總結(jié)

          不斷的通過備份、代理微信原有的方法,自主實(shí)現(xiàn)了簡(jiǎn)單的偵聽器和計(jì)算器。當(dāng)然這些代碼只是為了方便分享提取出來了提供思路,實(shí)際業(yè)務(wù)中遇到情況復(fù)雜的多,代碼量遠(yuǎn)遠(yuǎn)也不止這些。


          本頁內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁中由涉嫌抄襲的內(nèi)容,請(qǐng)及時(shí)與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會(huì)在5工作日內(nèi)聯(lián)系您,一經(jīng)查實(shí),本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://www.cjxv.cn/25244.html
          相關(guān)小程序
           八年  行業(yè)經(jīng)驗(yàn)

          多一份參考,總有益處

          聯(lián)系深圳網(wǎng)站公司塔燈網(wǎng)絡(luò),免費(fèi)獲得網(wǎng)站建設(shè)方案及報(bào)價(jià)

          咨詢相關(guān)問題或預(yù)約面談,可以通過以下方式與我們聯(lián)系

          業(yè)務(wù)熱線:余經(jīng)理:13699882642

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

          主站蜘蛛池模板: 毛片视频在线免费观看| 久久久久人妻精品一区三寸 | 欧洲精品码一区二区三区免费看| 国产产无码乱码精品久久鸭| 一区二区三区中文字幕| 欧美亚洲一区二区三区| 亚洲综合在线另类色区奇米| 韩国无遮挡吃奶床戏| 国产精品v欧美精品∨日韩| 97精品国产一区二区三区| 日本在线观看免费看片| 亚洲精品线在线观看| 音影先锋在线资源| 在线播放第一页| 久久久国产乱子伦精品| 杨幂精品国产福利在线| 亚洲成a人片在线观看www| 清纯校花被色老头糟蹋| 国产福利一区二区三区在线视频| 一本一道av无码中文字幕| 无码一区18禁3D| 久久久亚洲欧洲日产国码aⅴ | 四虎影视在线观看2022a| 两个人看的视频www在线高清| 成人午夜视频在线播放| 亚洲成年人影院| 精品日本一区二区三区在线观看| 国产特级毛片aaaaaa高清| juy031白木优子中文字幕| 日韩在线不卡视频| 亚洲人成网站色7799| 男同精品视频免费观看网站| 午夜高清在线观看| 国产美女在线一区二区三区| 天堂/在线中文在线资源官网| 一个人看的www免费高清中文字幕| 日韩久久精品一区二区三区| 亚洲AV无码一区二区三区网站 | 亚洲国产成人精品女人久久久| 男女男精品网站| 全彩里番acg里番本子h|