let person ={name:'xx',age:18}let p ={}
Object.defineProperty(p,'name',{configurable:true,get(){return person.name
},set(value){
person.name = value
}})
vue3原理
Proxy
Reflect
let person ={name:'xx',age:18}const p =newProxy(person,{get(target,propName){// 读取// Reflect 反射return Reflect.get(target,propName)},set(target,propName,value){// 修改
Reflect.get(target,propName,value)},deleteProperty(target,propName){// 删除return Reflect.deleteProperty(target,propName)}})
import{ref,reactive,watch}from'vue'exportdefault{name:'xxx',setup(){let sum =ref(0)let msg =ref('xxxxx')let person =reactive({name:'xx',age:18})// 监视ref定义的一个数据watch(sum,(newValue,oldValue)=>{},immediate:true)// 监视ref定义的多个数据watch([sum,msg],(newValue,oldValue)=>{})// oldValue无法正确获取// 深度监视不能关闭watch(person.(newValue,oldValue)=>{})return{
sum
}}}
watchEffect
import{ref,reactive,watch,watchEffect}from'vue'exportdefault{name:'xxx',setup(){let sum =ref(0)let msg =ref('xxxxx')let person =reactive({name:'xx',age:18})watchEffect(()=>{// 函数内部用到哪个值就监视哪个值// 监视sumconst x1 = sum.value
})return{
sum,msg,person
}}}
自定义hook
将某一功能逻辑写在单独的js文件内并export出
// src/hooks/demo.jsimport{reactive,onMounted,onBeforeUnmount}from'vue'exportdefaultfunction(){let point =reactive({x:0,y:0})functionsavePoint(event){
point.x = event.pageX
point.y = event.pageY
}onMounted(()=>{
window.addEventListener('click',savePoint)})onBeforeUnmount(()=>{
window.removeEventListener('click',savePoint)})return point
}
import demo from'./hooks/demo'exportdefault{name:'xxx',setup(){let point =demo()return{sum,point}}}
toRef&toRefs
import{reactive,toRef,toRefs}from'vue'exportdefault{name:'xxx',setup(){let person =reactive({name:'xx',age:18,job:{salary:20}})return{//age:toRef(person,'age'),//name:toRef(person,'name'),//salary:toRef(person.job,'salary')...toRefs(person)}}}
shallowReactive&shallowRef
shallowReactive
只考虑第一层响应式
shallowRef
只处理基本数据类型
import{reactive,toRef,toRefs,shallowReactive,shallowRef}from'vue'exportdefault{name:'xxx',setup(){let person =shallowReactive({// 只考虑第一层响应式name:'xx',age:18,job:{salary:20// 不考虑响应}})return{...toRefs(person)}}}
readonly&shallowReadonly
readonly
person = readonly(person)
shallowReadonly
person = shallowReadonly(person)
浅层不能修改
toRaw&markRaw
toRaw
将reactive()加工后的对象转化为原始对象
markRaw
标记对象,不会成为响应式对象
customRef
自定义ref
functionmyRef(value){returncustomRef((track,trigger)=>{return{get(){// 通知vue追踪数据变化track()return value
},set(newValue){
value = newValue
// 通知vue重新解析模板trigger()}}})}