React

useLayoutEffect

callback 中的操作一旦存在 会导致重绘或重排 的逻辑,建议使用 useLayoutEffect,能够有效预防视图的错位。
useLayoutEffect 与 didUpdate 相同,是在 useEffect 前触发的,useEffect 触发在视图完全渲染后,useLayoutEffect 则触发在 vnode 完成操作,未触发视图前。也就是 如果使用 useEffect 可能会让本来可以在 vnode 中计算避开的重绘或重排,体现在视图上,所以,也仅限于,这类视图变化需要避开时,才是 useLayoutEffect 需要使用的场景,典型的,如:相位移动同步。
而 setState 中的第二参数,与 useEffect 相同。
Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。相当于有数据变化的函数就是useLayoutEffect,没有的就是useEffect。
所以理论上来讲 useEffect 相当于一个粗制的高灵敏度响应器。大部分场景使用性能高且符合要求,只在render的同时触发上层依赖变化,再触发当前 effect 函数中变化视图的逻辑,会出现不符合需要的情况,也就是中间多了一次视图变化。
vue 的策略也谈不上最好,相当于响应数据多次触发视图变化的,略去重复帧,省去了使用者的自主选择,不会出现意想不到的错误,但可能会出现高频触发变更,视图变化变慢或丢帧的问题,但这应该也可以被调度优化。