- shallowReactive和reactive:
const reactiveHandler = {
get(target, prop) {
const result = Reflect.get(target, prop)
console.log('拦截了读取数据', prop, result);
return result
},
set(target, prop, value) {
const result = Reflect.set(target, prop, value)
console.log('拦截了修改数据或是添加属性', prop, value);
return result
},
deleteProperty(target, prop) {
const result = Reflect.deleteProperty(target, prop)
console.log('拦截了删除数据', prop);
return result
}
}
function shallowReactive(target) {
if (target && typeof target === 'object') {
return new Proxy(target, reactiveHandler)
}
return target
}
function reactive(target) {
if (target && typeof target === 'object') {
if (Array.isArray(target)) {
target.forEach((item, index) => {
target[index] = reactive(item)
})
}
else {
Object.keys(target).forEach((key) => {
target[key] = reactive(target[key])
})
}
const proxy = new Proxy(target, reactiveHandler)
return proxy
}
return target
}
<script>
//测试用例
const proxyUser1 = shallowReactive({
name: '小米',
car: {
color: 'red'
}
})
/*
proxyUser1.name = '小红' // 拦截了修改数据或是添加属性 name 小红
proxyUser1.name += '红' // 拦截了读取数据 name 小红 ; 拦截了修改数据或是添加属性 name 小红红
//只拦截了读 无法拦截修改数据
proxyUser1.car.color += '颜色' // 拦截了读取数据 car {color: 'red'}
// //只拦截了读 无法删除数据
delete proxyUser1.car.color // 拦截了读取数据 car {color: 'red颜色'}
*/
const proxyUser2 = reactive({
name: '小米',
car: {
color: 'red'
}
})
proxyUser2.name = '小红' // 拦截了修改数据或是添加属性 name 小红
proxyUser2.name += '红' // 拦截了读取数据 name 小红 ; 拦截了修改数据或是添加属性 name 小红红
proxyUser2.car.color += '颜色' // 拦截了读取数据 car Proxy {color: 'red'} 拦截了读取数据 color red 拦截了修改数据或是添加属性 color red颜色
//拦截了读 拦截了删除数据
delete proxyUser2.car.color // 拦截了读取数据 car {color: 'red颜色'} 拦截了删除数据 color
</script>
- shallowReadonly和readonly:
shallowReadonly和readonly和上面的处理类似,只是再处理对象中,不再进行删除,添加等操作,只能读取属性值
const readonlyHandler = {
get(target, prop) {
const result = Reflect.get(target, prop)
console.log('拦截了读取数据', prop, result);
return result
},
set(target, prop, value) {
console.warn('只能读取数据,不能修改数据或添加数据');
return true
},
deleteProperty(target, prop) {
console.warn('只能读取数据,不能删除数据', prop);
return true
}
}
function shallowReadonly(target) {
if (target && typeof target === 'object') {
return new Proxy(target, readonlyHandler)
}
return target
}
function readonly(target) {
if (target && typeof target === 'object') {
if (Array.isArray(target)) {
target.forEach((item, index) => {
target[index] = readonly(item)
})
} else {
Object.keys(target).forEach((key) => {
target[key] = readonly(target[key])
})
}
return new Proxy(target, reactiveHandler)
}
return target
}
const proxyUser3 = shallowReadonly({
name: '小米',
car: ['奔驰', '宝马']
})
const proxyUser4 = readonly({
name: '小米',
car: ['奔驰', '宝马']
})
proxyUser4.name
proxyUser4.car[0]
proxyUser4.car[0] = '奥迪'
delete proxyUser4.name
delete proxyUser4.car[0]