W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
小程序自定義組件擴(kuò)展 behavior,計(jì)算屬性 computed 和監(jiān)聽器 watch 的實(shí)現(xiàn)。在 data 或者 properties 改變時(shí),會(huì)重新計(jì)算 computed 字段并觸發(fā) watch 監(jiān)聽器。
此 behavior 依賴開發(fā)者工具的 npm 構(gòu)建。具體詳情可查閱官方 npm 文檔。
需要小程序基礎(chǔ)庫(kù)版本 >= 2.6.1 的環(huán)境。
你可以直接體驗(yàn)一下這個(gè)代碼片段,它包含了基本用法示例:https://developers.weixin.qq.com/s/gXK31mmZ73dd
npm install --save miniprogram-computed
const computedBehavior = require('miniprogram-computed')
Component({
behaviors: [computedBehavior],
data: {
a: 1,
b: 1,
},
computed: {
sum(data) {
// 注意: computed 函數(shù)中不能訪問(wèn) this ,只有 data 對(duì)象可供訪問(wèn)
// 這個(gè)函數(shù)的返回值會(huì)被設(shè)置到 this.data.sum 字段中
return data.a + data.b
},
},
methods: {
onTap() {
this.setData({
a: this.data.b,
b: this.data.a + this.data.b,
})
}
}
})
<view>A = {{a}}</view>
<view>B = {}</view>
<view>SUM = {{sum}}</view>
<button bindtap="onTap">click</button>
const computedBehavior = require('miniprogram-computed')
Component({
behaviors: [computedBehavior],
data: {
a: 1,
b: 1,
sum: 2,
},
watch: {
'a, b': function(a, b) {
this.setData({
sum: a + b
})
},
},
methods: {
onTap() {
this.setData({
a: this.data.b,
b: this.data.a + this.data.b,
})
}
}
})
<view>A = {{a}}</view>
<view>B = {}</view>
<view>SUM = {{sum}}</view>
<button bindtap="onTap">click</button>
這個(gè) behavior 的 ^1.0.0 版本和 ^2.0.0 版本有較大差異。 ^2.0.0 版本基于小程序基礎(chǔ)庫(kù) 2.6.1 開始支持的 observers 定義段實(shí)現(xiàn),具有較好的性能。以下是版本之間主要區(qū)別的比較。
項(xiàng)目 | ^1.0.0 | ^2.0.0 |
---|---|---|
支持的基礎(chǔ)庫(kù)最低版本 | 2.2.3 | 2.6.1 |
支持 watch 定義段 | 否 | 是 |
性能 | 相對(duì)較差 | 相對(duì)較好 |
從原理上說(shuō), watch 的性能比 computed 更好;但 computed 的用法更簡(jiǎn)潔干凈。
此外, computed 字段狀態(tài)只能依賴于 data 和其他 computed 字段,不能訪問(wèn) this 。如果不可避免要訪問(wèn) this ,則必須使用 watch 代替。
在 watch 字段上可以使用 ** 通配符,是它能夠監(jiān)聽這個(gè)字段下的子字段的變化(類似于小程序基礎(chǔ)庫(kù)本身的 observers)。示例代碼片段
const computedBehavior = require('miniprogram-computed')
Component({
behaviors: [computedBehavior],
data: {
obj: {
a: 1,
b: 2,
}
},
watch: {
'obj.**': function(obj) {
this.setData({
sum: obj.a + obj.b
})
},
},
methods: {
onTap() {
this.setData({
'obj.a': 10
})
}
}
})
除此以外:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: