1、包含的功能及函数
isRef、isReactive、isReadonly、isProxy、shallowReactive、reactive、shallowReadonly、readonly、shallowRef、ref
2、函数实现
const reactiveHandler = {
get(target, prop) {
if (prop === '_is_reactive') return true;
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]);
});
}
return new Proxy(target, reactiveHandler);
}
return target;
}
const readonlyHandler = {
get(target, prop) {
if (prop === '_is_readonly') return true;
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('只能读取数据,不能删除数据');
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, readonlyHandler);
}
return target;
}
function shallowRef(target) {
return {
_value: target,
get value() {
console.log('劫持到了读取数据');
return this._value;
},
set value(val) {
console.log('劫持到了修改数据,准备更新界面', val);
this._value = val;
}
}
}
function ref(target) {
target = reactive(target);
return {
_is_ref: true,
_value: target,
get value() {
console.log('劫持到了读取数据');
return this._value;
},
set value(val) {
console.log('劫持到了修改数据,准备更新界面', val);
this._value = val;
}
}
}
function isRef(obj) {
return obj && obj._is_ref;
}
function isReactive(obj) {
return obj && obj._is_reactive;
}
function isReadonly(obj) {
return obj && obj._is_readonly;
}
function isProxy(obj) {
return isReactive(obj) || isReadonly(obj);
}
3、函数调用
const proxyUser1 = shallowReactive({
name: '小明',
car: {
color: 'red'
}
});
proxyUser1.name += '==';
proxyUser1.car.color + '==';
delete proxyUser1.name;
delete proxyUser1.car.color;
const proxyUser2 = reactive({
name: '小明',
car: {
color: 'red'
}
});
proxyUser2.name += '==';
proxyUser2.car.color = '==';
delete proxyUser2.name;
delete proxyUser2.car.color;
const proxyUser3 = shallowReadonly({
name: '小明',
cars: ['奔驰', '宝马']
});
console.log(proxyUser3.name);
proxyUser3.name = '==';
delete proxyUser3.name;
proxyUser3.cars[0] = '奥迪';
delete proxyUser3.cars[0];
const proxyUser4 = readonly({
name: '小明',
cars: ['奔驰', '宝马']
});
console.log(proxyUser4.name);
console.log(proxyUser4.cars[0]);
proxyUser4.name = '哈哈';
proxyUser4.cars[0] = '哈哈';
delete proxyUser4.name;
delete proxyUser4.cars[0];
const ref1 = shallowRef({
name: '小明',
car: {
color: 'red'
}
});
console.log(ref1.value);
ref1.value = '==';
ref1.value.car = '==';
const ref2 = ref({
name: '小明',
car: {
color: 'red'
}
});
console.log(ref2.value);
ref2.value = '==';
ref2.value.car = '==';
console.log(isRef(ref({})));
console.log(isReactive(reactive({})));
console.log(isReadonly(readonly({})));
console.log(isProxy(reactive({})));
console.log(isProxy(readonly({})));