reactive
源码截图
理解
reactive方法,接受一个对象类型的参数,返回一个被proxy代理的响应式对象,在响应式对象的get和set,deleteProperty进行依赖的收集和更新.另外,也给代理的后的响应式对象添加了对应的标识,例如只读,获取源对象等
ref
源码截图
理解
ref接收一个值,返回一个响应式的ref类型的对象,如果传入的值本来就是ref类型,则直接返回,如果接收的值为对象类型,那么就通过reactive去深层变为响应式,当通过ref的value属性获取值时,触发依赖收集,当修改value属性时,如果修改的值和原来不同,就通知依赖更新
toRaw
源码截图
理解
toRaw方法返回一个Vue代理(特指reactive,ref不是代理,但ref如果值是对象类型,也是通过reactive)的原始对象。通过Vue代理一个对象,代理对象的get方法都是由createGetter返回,toRaw获取的是一个代理对象的ReactiveFlags.RAW属性(枚举类型,实际为字符串__v_raw),那么在get中,配合传入的参数,可以知道传入toRaw的对象是否被代理,如果被代理就会返回代理的原始对象(Proxy的get方法,第一个参数为代理的原始对象),如果没有被代理,那么,就将传入toRaw的参数原样返回.
toRef
源码截图
理解
toRef可以将响应式对象的某个属性,设置为ref(算是特殊的ref吧,实际上是操作原来的响应式对象, 如果已经是ref则直接返回),并返回它.返回的ref和源同步,因为操作的都是同一个对象~
toRefs
源码截图
理解
toRefs可以将一个响应式对象转化为普通对象,并且,这个普通对象的每一个属性都变为ref都对应源属性,修改都会同步,实际上就是遍历传入toRefs的响应式对象,每一个属性都通过toRef变为ref类型的