小程式如何透過watch和computed檢測數據
在vue中,computed是一個計算屬性,類似於過濾器,對綁定到view的資料進行處理,並監聽變化。而watch監聽複雜資料類型需用深度監聽。這兩者都可以在vue上實現檢測資料的變化。而微信小程式不同於vue可以使用watch和computed做出對應的改變。小程式中只有函數this.setData()可以偵測數據,所以小程式每次資料改變需要偵測時都必須手動執行函數才可實現。除此之外,小程式還可以附上這兩個功能來偵測資料變化。
vue 裡是透過 Object.defineProperty 來實現資料變化偵測的,給該變數的 setter 裡注入所有的綁定操作,就可以在變數變更時帶動其它資料的變化。實際上,在小程式裡實作要比 vue 裡簡單,應為對於 data 裡物件來說,vue 要遞歸的綁定物件裡的每一個變量,使其響應式化。但在微信小程式裡,不管是對物件或基本型,只能透過 this.setData() 來改變,這樣我們只要偵測 data 裡面的 key 值的變化,而無法偵測 key 值裡面的 key 。
測試程式碼:
Page({ data: { test: { a: 123 }, test1: \'test1\', }, onLoad() { computed(this, { test2: function() { returnthis.data.test.a + \'2222222\' }, test3: function() { returnthis.data.test.a + \'3333333\' } }) watch(this, { test:function(newVal) { console.log(\'invoke watch\') this.setData({test1: newVal.a + \'11111111\' }) } }) }, changeTest() { this.setData({ test:{ a: Math.random().toFixed(5) } }) }, })
現在我們要實作 watch 和 computed 方法,使得 test 變化時,test1、test2、test3 也變化,為此,增加了一個按鈕,點擊這個按鈕時,test 會改變。
watch 方法相對簡單點,首先我們定義一個函數來偵測變化:
function defineReactive(data, key, val, fn) { Object.defineProperty(data, key, { configurable: true, enumerable: true, get: function() { return val }, set: function(newVal){ if (newVal === val)return fn &&fn(newVal) val = newVal }, }) }
然後遍歷 watch 函數傳入的對象,給每個鍵呼叫該方法
function watch(ctx, obj) { Object.keys(obj).forEach(key => { defineReactive(ctx.data, key, ctx.data[key], function(value) { obj[key].call(ctx,value) }) }) }
這裡有參數是 fn ,也就是上面 watch 方法裡 test 的值,這裡把方法包一層,綁定 context。
接著來看 computed,這個稍微複雜,因為我們無法得知 computed 裡依賴的是 data 裡面的哪個變量,因此只能遍歷 data 裡的每個變數。
function computed(ctx, obj) { let keys =Object.keys(obj) let dataKeys =Object.keys(ctx.data) dataKeys.forEach(dataKey => { defineReactive(ctx.data, dataKey, ctx.data[dataKey]) }) let firstComputedObj =keys.reduce((prev, next) => { ctx.data.$target =function() { ctx.setData({[next]: obj[next].call(ctx) }) } prev[next] =obj[next].call(ctx) ctx.data.$target =null return prev }, {}) ctx.setData(firstComputedObj) }
詳細解釋下這段程式碼,首先給 data 裡的每個屬性呼叫 defineReactive 方法。接著計算 computed 裡面每個屬性第一次的值,也就是上例的 test2、test3。
computed(this, { test2: function() { returnthis.data.test.a + \'2222222\' }, test3: function() { returnthis.data.test.a + \'3333333\' } })
這裡分別呼叫 test2 和 test3 的值,將回傳值與對應的 key 值組合成一個對象,然後再呼叫 setData() ,這樣就會第一次計算這兩個值,這裡使用了 reduce 方法。 test2 和 test3 都是依賴 test 的,因此必須在 test 改變的時候在其的 setter 函數呼叫 test2 和 test3 中對應的函數,並且透過 setData 來設定這兩個變數。
小型程式商店提供更多上線小程式
宣告了一個變數來保存所有在變更時需要執行的函數,在 set 時執行每一個函數,因為此時 this.data.test 的數值尚未改變,使用 setTimeout 在下一輪再執行。現在就有一個問題,怎麼將函數加入 subs 。不知道各位還是否記得上面我們說到的在 reduce 裡的兩行程式碼。因為在執行計算 test1 和 test2 第一次 computed 值的時候,會呼叫 test 的 getter 方法,而此刻就是一個好機會將函數注入到 subs 中,在 data 上宣告一個 $target 變數,並將需要執行的函數賦值給這個變量,這樣在 getter 中就可以判斷 data 上有無 target 值,從而可以 push 進 subs,注意的是需要馬上將 target 設為 null,
#到此已經實現了 target 設為 null,
#到此為止已經實現了 target 和 computed,但還沒完,有個問題。當同時使用這兩者的時候,watch 裡的物件的鍵也同時存在於 data 中,這樣就會重複在該變數上呼叫 Object.defineProperty ,後面會覆蓋前面。因為這裡不像 vue 裡可以決定兩者的呼叫順序,因此我們推薦先寫 computed 再寫 watch,這樣可以 watch computed 裡的數值。 推薦:《
小程式開發教學###》###以上是小程式如何透過watch和computed檢測數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

隨著行動互聯網技術和智慧型手機的普及,微信成為了人們生活中不可或缺的一個應用。而微信小程式則讓人們可以在不需要下載安裝應用程式的情況下,直接使用小程式來解決一些簡單的需求。本文將介紹如何使用Python來開發微信小程式。一、準備工作在使用Python開發微信小程式之前,需要先安裝相關的Python函式庫。這裡推薦使用wxpy和itchat這兩個函式庫。 wxpy是一個微信機器

小程式能用react,其使用方法:1、基於「react-reconciler」實作一個渲染器,產生一個DSL;2、建立一個小程式元件,去解析和渲染DSL;3、安裝npm,並執行開發者工具中的建構npm;4、在自己的頁面中引入包,再利用api即可完成開發。

實作微信小程式中的卡片翻轉特效在微信小程式中,實現卡片翻轉特效是一種常見的動畫效果,可以提升使用者體驗和介面互動的吸引力。以下將具體介紹如何在微信小程式中實現卡片翻轉的特效,並提供相關程式碼範例。首先,需要在小程式的頁面佈局檔案中定義兩個卡片元素,一個用於顯示正面內容,一個用於顯示背面內容,具體範例程式碼如下:<!--index.wxml-->&l

本站10月31日消息,今年5月27日,螞蟻集團宣布啟動“漢字拾光計劃”,最近又迎來新進展:支付寶上線“漢字拾光-生僻字”小程序,用於向社會徵集生僻字,補充生僻字庫,同時提供不同的生僻字輸入體驗,以幫助完善支付寶內的生僻字輸入方法。目前,用戶搜尋「漢字拾光」、「生僻字」等關鍵字就可以進入「生僻字」小程式。在小程式裡,使用者可以提交尚未被系統辨識輸入的生僻字圖片,支付寶工程師確認後,將會對字庫進行補錄入。本站注意到,使用者也可以在小程式體驗最新的拆字輸入法,這項輸入法針對讀音不明確的生僻字設計。用戶拆

uniapp如何實現小程式和H5的快速轉換,需要具體程式碼範例近年來,隨著行動網路的發展和智慧型手機的普及,小程式和H5成為了不可或缺的應用形式。而uniapp作為一個跨平台的開發框架,可以在一套程式碼的基礎上,快速實現小程式和H5的轉換,大大提高了開發效率。本文將介紹uniapp如何實現小程式和H5的快速轉換,並給出具體的程式碼範例。一、uniapp簡介unia

實現思路x01服務端的建立首先,在服務端,使用socket進行訊息的接受,每接受一個socket的請求,就開啟一個新的線程來管理訊息的分發與接受,同時,又存在一個handler來管理所有的線程,從而實現對聊天室的各種功能的處理x02客戶端的建立客戶端的建立就要比服務端簡單多了,客戶端的作用只是對消息的發送以及接受,以及按照特定的規則去輸入特定的字符從而實現不同的功能的使用,因此,在客戶端這裡,只需要去使用兩個線程,一個是專門用於接受消息,一個是專門用於發送消息的至於為什麼不用一個呢,那是因為,只

這篇文章給大家帶來了關於微信小程式的相關問題,其中主要介紹瞭如何在小程式中用公眾號範本訊息,下面一起來看一下,希望對大家有幫助。

1.開啟微信小程序,進入對應的小程式頁面。 2.在小程式頁面中尋找會員相關入口,通常會員入口在底部導覽列或個人中心等位置。 3.點選會員入口,進入會員申請頁。 4、在會員申請頁面,填寫相關信息,如手機號碼、姓名等,完成資料填寫後,提交申請。 5.小程式方會對會員申請審核,審核通過後,用戶即可成為微信小程式會員。 6.作為會員,用戶將享有更多的會員權益,如積分、優惠券、會員專屬活動等
