@@ -28,14 +28,13 @@ layout: doc
28
28
通过配置这些traps可以进一步实现shallowreactive,readonly等api
29
29
30
30
## computed
31
- 使用computed注册的响应式数据使用方法与ref差不多,都要使用.value,实际上computed会返回一个对象,里面有个访问器属性value
31
+ 使用computed会返回一个对象,它也有一个访问器属性value,初始化时会执行一遍里面的回调函数,搜集依赖。
32
32
33
- 初始化会自动执行一遍里面的回调函数,收集依赖, 并且还有两个属性dirty和value,dirty初始化是true ,代表需要重新执行回调,value则是执行完回调return的值
33
+ 并且还有两个属性dirty和value,dirty初始化设置为true ,代表需要重新执行回调,value则是回调return的值。
34
34
35
- 当computed依赖的响应式数据发生改变,dirty被设置为true,当触发getter时需要重新执行回调,将return的值缓存到value,并把新值返回
36
-
37
- 如果依赖没有改变,也就是dirty为false,就会直接返回缓存的value
35
+ 当computed依赖的响应式数据发生变化,dirty被设置为true,当触发getter时会重新执行回调,并更新value,将新值返回。
38
36
37
+ 如果依赖没有改变,触发getter不会重新执行回调,而是返回缓存的value。
39
38
## nextTick
40
39
::: tip :rocket :
41
40
我们通过js修改dom时 dom树在内存中是同步发生更新的,但是此时的最新状态并不会立即反应到屏幕上 而是要等待浏览器的渲染周期和帧率有关 一般在16.6ms 当渲染完成后 才能在屏幕观测到最新的页面
@@ -47,20 +46,15 @@ layout: doc
47
46
48
47
nexttick的原理就是通过promise的链式调用,将nexttick里的回调放在上面的微任务.then里执行
49
48
## watch
50
- 首先会把watch的第一个参数标准化,也就是getter函数的形式。然后使用ReactiveEffect类创建一个effect对象,并将watch里的回调函数设置为effect的调度器函数,
51
-
52
- 当监听的响应式数据发生变化,会执行effect里的调度器。并且执行过程中会调用effect.run,会返回getter函数return的值,也就获取了新值。旧值是通过闭包拿到
53
-
54
- 把新值和旧值作为watch回调的参数
55
-
56
- 通过源码可以发现,watch监听ref reactive数据类型是不同的,当是reactive类型,默认会调用traverse进行深度监听,对于ref类型,不会进行深度监听,通过设置deep:true能实现深度监听
49
+ 基于vue响应式系统,首先会将watch的第一个参数标准化,也就是getter函数的形式,将其创建为一个响应式副作用,配合调度器控制watch回调的执行。
57
50
58
- 对于immediate,默认是false,不会执行effect的调度器函数
51
+ 当响应式数据发生改变,触发trigger派发更新,由于调度器的存在,会再次执行watch里的回调,也会执行上面的getter函数拿到新值,旧值通过闭包拿到,最后将新旧值做为回调的参数。
59
52
60
- 对于flush,这跟组件的更新时机有关系,默认是pre,也就是在父组件更新之后,子组件更新之前执行,post是在组件更新之后,sync则是同步执行
53
+ 通过源码可以发现,watch监听ref reactive数据类型是不同的,当是reactive类型,默认会调用traverse进行深度监听,对于ref类型,不会进行深度监听,通过设置deep:true能实现深度监听。
61
54
62
- watchEffect都是基于doWatch方法,不同点是回调为null,配置也只有flush
55
+ 对于flush,这跟组件的更新时机有关系,默认是pre,也就是在父组件更新之后,子组件更新之前执行,post是在组件更新之后,sync则是同步执行。
63
56
57
+ watchEffect则是vue提供的创建响应式副作用的api。
64
58
## keepalive
65
59
卸载时并不会真的卸载,而是移动到一个隐藏容器里,挂载时也不是真的挂载,而是从隐藏容器中取出放在页面上
66
60
0 commit comments