先说说react原版的useEffect使用起来不便的地方

    1. useEffect(
    2. function() {
    3. // effect操作
    4. },
    5. ['a', 'b', { name: 'c' }]
    6. );

    这里的effect每次更新都会执行,因为第三个参数一直是不等的,{name: ‘c’} !== {name: ‘c’}
    第二是在deps依赖很多的时候是真的麻烦
    下面贴出改进版useEffect

    1. import { useRef, useEffect } from 'react';
    2. import _ from 'lodash';
    3. export function useDeepCompareEffect<T>(fn, deps: T) {
    4. // 使用一个数字信号控制是否渲染,简化 react 的计算,也便于调试
    5. let renderRef = useRef<number | any>(0);
    6. let depsRef = useRef<T>(deps);
    7. if (!_.isEqual(deps, depsRef.current)) {
    8. renderRef.current++;
    9. }
    10. depsRef.current = deps;
    11. return useEffect(fn, [renderRef.current]);
    12. }

    在使用的时候什么都不用做,只需要把参数传进来就行。
    避免了之前的浅比较的缺陷,性能上有降低
    deps稍微控制一下量,此处的性能不是大问题
    写起来爽就完事了,要啥自行车。

    1. useDeepCompareEffect(function() {
    2. // effect操作
    3. }, 'a');
    4. useDeepCompareEffect(
    5. function() {
    6. // effect操作
    7. },
    8. { name: 'c' }
    9. );
    10. useDeepCompareEffect(function() {
    11. // effect操作
    12. }, 4567);