watch:
第一个参数为:监视的对象 第二个参数为回调函数 第三个参数为配置信息 例如 immediate
watch(sum , ()=>{} , {immediate : true})
(1)监视ref定义的一个响应式数据
watch('nane' , (newValue , oldValue)=>{
})
(2)监视ref定义的多个响应式数据
watch('[name,...]' , (newValue , oldValue)=>{
//这里面的newValue和oldValue都为数组类型对象,其中的index值与第一个参数的index相对应
newValue 数组有两个成员 第一个为相对应的index值 第二个为改变后的值 oldValue 同理
})
(3)监视reactive定义的多个响应式数据,注意:此处无法正确的获取oldValue
watch (person , (newValue ,oldValue)=>{
})
(4)监视reactive定义的响应式数据中的某一个属性,此时newValue好使 此时可以获取正确的newValue
watch(()=>person.age , (newValue , oldValue) => {
})
(4)监视reactive定义的响应式数据中的某些属性,此时newValue好使
watch([()=>person.age , ()=>person.age] , (newValue , oldValue) => {
})
(5)特殊情况,监视reactive定义的响应式数据中的属性,且该属性是多层级的,则需要开启深度监视
watch(()=>person.age , (newValue , oldValue) => {
},{deep : true})
存在的坑:newValue 和 oldValue为相同的值,现在仍没有解决测试过了。
如果对象存在的层级较多的时候,只要是reactive定义的无论多深都可以监视到,且无法关掉深度监视(deep配置无效),个人认为这是reactive所导致的。
如果监视的是基础类型的数据,newvalue好使,但是如果监视的是reactive的对象类型,newvalue不好使。其中监视reactive的某一属性时,该属性为基本数据类型,从根本来说,也是监视基础类型的数据,所以newValue好使
如果直接监视的是reactive定于的对象,是直接深度的。如果监视的是reactive定义的对象的属性,且该属性多层级,则需要开启深度监视。
个人理解:为什么监视对象的时候不好使呢,可能底层源码监视对象的时候,监视的是对象的地址值,而不是对象地址所指向的基本数据类型的值。一旦配置deep深度监视后,就不再监视地址了。
监视reactive对象的时候,默认开启深度监视。但是监视普通对象的时候需要开启深度监视。
watchEffect函数
·默认开启immediate
也是做监视用的,但是不用指明对象,只要在回调函数里面使用,就会智能地区检测用到的数据。
watchEffect(()=>{
//里面用到了哪些属性就监视那些属性(所依赖的数据)
})
watchEffect有点像computed,但是其注重过程不用写返回值。一般用于一些报销流程啊,发票啊什么的。
生命周期:
没啥较大的改变,就是在一开始的时候更加智能,只有万事俱备,配置完毕后才会继续往下走,不会像vue2的时候新建后就往下走。
通过配置项的形式写生命周期钩子,beforeCreate vreate 不具有组合式API setup就相当于二者
vue3的最大特点,组合式API
hook函数:
本质是一个函数
其实就是一个存放各种方法的文件夹,将可以复用的各种方法放进去。
将setup中组合API在hooks中进行封装。使代码更简单。
toRef(特别重要)
创建一个ref对象,其value值指向另一个对象中的某一个属性。
第一个参数:那个对象,第二个参数,那个属性(要用字符串)
该函数不是新创建一个ref对象,是将你要用的数据转化为ref对象并且和元数据进行绑定。
可以把数据属性拆散出去,并且是响应式。