記錄在小程序項目實現的時候出現的小問題:
在其他組件中如何監聽到全局變量為數組的改變,而作出回調。使用場景為:在商品詳情頁面添加商品至全局變量數組里,而購物車組件需要監聽到這個全局變量的更改,做出回調。
想到的思路:主動回調、使用watch函數監聽全局變量(查詢了下小程序官方提供的拓展computed好像不能監聽全局屬性,只好自行定義)
主動回調:
在需要回調的組件中,全局對象app添加回調函數。當回調函數的時候就會執行這里的函數
// 設置添加購物車回調函數 app.addCartCallBack = () => { this._getCartList() }
在修改全局變量的地方,執行回調函數
addCart(good) { const isHave = this.globalData.cartList.find(item => { return item.iid === good.iid }) if (isHave) { isHave.count++ } else { good.count = 1 good.check = false this.globalData.cartList.push(good) } // this.globalData.num = ["1"] console.log(this.globalData.num) if (this.addCartCallBack) { // 執行回調 this.addCartCallBack() } }
watch監聽全局變量:
使用Object.defineProperty()方法,執行對象的 getter/setter方法來判斷屬性是否改變,如改變則執行回調
// 全局屬性
globalData: {
num: []
},
// 定義watch函數監聽全局屬性 watch(method){ var obj = this.globalData Object.defineProperty(obj, 'num', { configurable: true, enumerable: true, set: function (value) { this._name = value;
// 執行傳入參數的回調函數 method(value); }, get: function () { return this._name } }) }
然后,在回調的地方執行app.watch方法且傳入回調函數
// 執行watch const watchCallBack = (value) => { console.log(value) } app.watch(watchCallBack)
最后發現watch只能監聽已存在的屬性,監聽不了數組中的push、pop方法
只能采取主動回調的方法實現了