Skip to content

useUnmount

用法

loading

源码

js
import { useEffect } from 'react';
import useLatest from '../useLatest';
import { isFunction } from '../utils';
import isDev from '../utils/isDev';

const useUnmount = (fn: () => void) => {
  if (isDev) {
    if (!isFunction(fn)) {
      console.error(`useUnmount expected parameter is a function, got ${typeof fn}`);
    }
  }

  const fnRef = useLatest(fn);

  useEffect(
    () => () => {
      fnRef.current();
    },
    [],
  );
};

export default useUnmount;

useLatest 的作用是返回一个最新的值,这里主要是为了解决闭包问题。

js
import { useRef } from 'react';

function useLatest<T>(value: T) {
  const ref = useRef(value);
  ref.current = value;

  return ref;
}

export default useLatest;

解读

先是环境判断,开发模式下传入参数的类型不为 Function 时,输出错误日志。

然后,主要逻辑就是上面高亮的 15-17 行,用 useEffect 包了一层,然后再将入参函数的执行结果返回。