91 lines
2.7 KiB
JavaScript
91 lines
2.7 KiB
JavaScript
|
import _set from '../utils/_set'
|
||
|
import debounce from '../utils/debounce'
|
||
|
|
||
|
/**
|
||
|
* 老setData polyfill
|
||
|
* 用于转换后的uniapp的项目能直接使用this.setData()函数
|
||
|
* @param {*} obj
|
||
|
* @param {*} callback
|
||
|
*/
|
||
|
function oldSetData (obj, callback) {
|
||
|
let that = this
|
||
|
const handleData = (tepData, tepKey, afterKey) => {
|
||
|
var tepData2 = tepData
|
||
|
tepKey = tepKey.split('.')
|
||
|
tepKey.forEach(item => {
|
||
|
if (tepData[item] === null || tepData[item] === undefined) {
|
||
|
let reg = /^[0-9]+$/
|
||
|
tepData[item] = reg.test(afterKey) ? [] : {}
|
||
|
tepData2 = tepData[item]
|
||
|
} else {
|
||
|
tepData2 = tepData[item]
|
||
|
}
|
||
|
})
|
||
|
return tepData2
|
||
|
}
|
||
|
const isFn = function (value) {
|
||
|
return typeof value == 'function' || false
|
||
|
}
|
||
|
Object.keys(obj).forEach(function (key) {
|
||
|
let val = obj[key]
|
||
|
key = key.replace(/\]/g, '').replace(/\[/g, '.')
|
||
|
let front, after
|
||
|
let index_after = key.lastIndexOf('.')
|
||
|
if (index_after != -1) {
|
||
|
after = key.slice(index_after + 1)
|
||
|
front = handleData(that, key.slice(0, index_after), after)
|
||
|
} else {
|
||
|
after = key
|
||
|
front = that
|
||
|
}
|
||
|
if (front.$data && front.$data[after] === undefined) {
|
||
|
Object.defineProperty(front, after, {
|
||
|
get () {
|
||
|
return front.$data[after]
|
||
|
},
|
||
|
set (newValue) {
|
||
|
front.$data[after] = newValue
|
||
|
that.hasOwnProperty("$forceUpdate") && that.$forceUpdate()
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true
|
||
|
})
|
||
|
front[after] = val
|
||
|
} else {
|
||
|
that.$set(front, after, val)
|
||
|
}
|
||
|
})
|
||
|
// this.$forceUpdate();
|
||
|
isFn(callback) && this.$nextTick(callback)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 变量名正则
|
||
|
*/
|
||
|
const variableNameReg = /^([^\x00-\xff]|[a-zA-Z_$])([^\x00-\xff]|[a-zA-Z0-9_$])*$/
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 2022-10-31 重写setData
|
||
|
* 2023-05-08 增加微信“简易双向绑定”支持
|
||
|
* 用于转换后的uniapp的项目能直接使用this.setData()函数
|
||
|
* @param {Object} obj
|
||
|
* @param {Object} callback
|
||
|
*/
|
||
|
export function setData (obj, callback = null) {
|
||
|
Object.keys(obj).forEach((key) => {
|
||
|
_set(this, key, obj[key])
|
||
|
|
||
|
//处理微信“简易双向绑定”
|
||
|
if (variableNameReg.test(key) && key.endsWith("Clone")) {
|
||
|
let propName = key.replace(/Clone$/, "")
|
||
|
if (this.$options.propsData[propName]) {
|
||
|
this.$emit(`update:${propName}`, obj[key])
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
debounce(this, '$forceUpdate', 200)
|
||
|
if (typeof callback == 'function') this.$nextTick(callback)
|
||
|
}
|