You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.8 KiB
49 lines
1.8 KiB
3 years ago
|
import isEmpty from './isEmpty'
|
||
|
import shallowEqual from './shallowEqual'
|
||
|
|
||
|
const ALL_DATA_KEY = '**'
|
||
|
|
||
|
const trim = (str = '') => str.replace(/\s/g, '')
|
||
|
|
||
|
export default Behavior({
|
||
|
lifetimes: {
|
||
|
attached() {
|
||
|
this.initComputed()
|
||
|
},
|
||
|
},
|
||
|
definitionFilter(defFields) {
|
||
|
const { computed = {} } = defFields
|
||
|
const observers = Object.keys(computed).reduce((acc, name) => {
|
||
|
const [field, getter] = Array.isArray(computed[name]) ? computed[name] : [ALL_DATA_KEY, computed[name]]
|
||
|
return {
|
||
|
...acc,
|
||
|
[field]: function(...args) {
|
||
|
if (typeof getter === 'function') {
|
||
|
const newValue = getter.apply(this, args)
|
||
|
const oldValue = this.data[name]
|
||
|
if (!isEmpty(newValue) && !shallowEqual(newValue, oldValue)) {
|
||
|
this.setData({ [name]: newValue })
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
}
|
||
|
}, {})
|
||
|
|
||
|
Object.assign(defFields.observers = (defFields.observers || {}), observers)
|
||
|
Object.assign(defFields.methods = (defFields.methods || {}), {
|
||
|
initComputed: function(data = {}, isForce = false) {
|
||
|
if (!this.runInitComputed || isForce) {
|
||
|
this.runInitComputed = false
|
||
|
const context = this
|
||
|
const result = { ...this.data, ...data }
|
||
|
Object.keys(observers).forEach((key) => {
|
||
|
const values = trim(key).split(',').reduce((acc, name) => ([...acc, result[name]]), [])
|
||
|
observers[key].apply(context, values)
|
||
|
})
|
||
|
this.runInitComputed = true
|
||
|
}
|
||
|
},
|
||
|
})
|
||
|
},
|
||
|
})
|