实现useUpdateEffect

1,561 阅读1分钟

自定义hooks

作为react的使用者,自定义hooks是常见的业务需求,小弟技术水平有限,只能先借花献佛聊下公司里大佬们封装的自定义hooks了

import { useRef } from 'react';
import type { useEffect, useLayoutEffect } from 'react';

type effectHookType = typeof useEffect | typeof useLayoutEffect;

export const createUpdateEffect: (hook: effectHookType) => effectHookType =
  (hook) => (effect, deps) => {
    const isMounted = useRef(false);

    // for react-refresh
    hook(() => {
      return () => {
        isMounted.current = false;
      };
    }, []);

    hook(() => {
      if (!isMounted.current) {
        isMounted.current = true;
      } else {
        return effect();
      }
    }, deps);
  };
import { useEffect } from 'react';
import { createUpdateEffect } from './utils';

/**
 * useUpdateEffect 用法等同于 useEffect,但是会忽略首次执行,只在依赖更新时执行
 */
export const useUpdateEffect = createUpdateEffect(useEffect);

export {
  createUpdateEffect
}

useUpdateEffect 用法等同于 useEffect,但是会忽略首次执行,只在依赖更新时执行。

用法如下

import React, { useEffect, useState } from 'react';
import { Button } from 'antd'
import { useUpdateEffect } from '@pansy/react-hooks';

export default () => {
  const [count, setCount] = useState(0);
  const [effectCount, setEffectCount] = useState(0);
  const [updateEffectCount, setUpdateEffectCount] = useState(0);

  useEffect(() => {
    setEffectCount((c) => c + 1);
  }, [count]);

  useUpdateEffect(() => {
    setUpdateEffectCount((c) => c + 1);
  }, [count]);

  return (
    <div>
      <p>effectCount: {effectCount}</p>
      <p>updateEffectCount: {updateEffectCount}</p>
      <p>
        <Button onClick={() => setCount((c) => c + 1)}>
          reRender
        </Button>
      </p>
    </div>
  );
};

个人的分享记录,不喜勿喷。