ahooks源码分析-useMount和useUnmount

2,840 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

今天开始一起学习分享 ahooks 的源码

ahooks是阿里巴巴出品的一套高质量可靠的 React Hooks 库

今天分享 第15个 hooks-useMount和useUnmount

useMount

首先看下 # useMount 的作用是什么

useMount 的作用是 只在组件初始化时执行的 Hook。

接下来 看下 API

API

useMount(fn: () => void);

参数

只有1个参数,就是fn,表示初始化时执行的函数

参数说明类型默认值
fn初始化时执行的函数() => void-
接下来 看下 用法

基本用法

在组件首次渲染时,执行方法。

import { useMount, useBoolean } from 'ahooks';
import { message } from 'antd';
import React from 'react';

const MyComponent = () => {
  useMount(() => {
    message.info('mount');
  });

  return <div>Hello World</div>;
};

export default () => {
  const [state, { toggle }] = useBoolean(false);

  return (
    <>
      <button type="button" onClick={toggle}>
        {state ? 'unmount' : 'mount'}
      </button>
      {state && <MyComponent />}
    </>
  );
};

在组件未加载时显示unmount,组件加载后,显示mount

image.png

接下来一起看下 源码

源码

1.直接通过 useEffect 执行 传入的 函数fn

  useEffect(() => {
    fn?.();
  }, []);

2.源码里做了个判断,判断是否是开发环境,如果是开发环境,并且传入的参数不是一个函数,则直接报错

if (isDev) {
    if (!isFunction(fn)) {
      console.error(
        `useMount: parameter \`fn\` expected to be a function, but got "${typeof fn}".`,
      );
    }
  }

useUnmount

首先看下 useUnmount 的作用是什么

useUnmount 的作用是 在组件卸载(unmount)时执行的 Hook。

接下来 看下 API

API

useUnmount(fn: () => void);

参数

只有1个参数,就是fn,表示组件卸载时执行的函数

参数说明类型默认值
fn组件卸载时执行的函数() => void-
接下来 看下 用法

基本用法

在组件首次渲染时,执行方法。

import { useBoolean, useUnmount } from 'ahooks';
import { message } from 'antd';
import React from 'react';

const MyComponent = () => {
  useUnmount(() => {
    message.info('unmount');
  });

  return <p>Hello World!</p>;
};

export default () => {
  const [state, { toggle }] = useBoolean(true);

  return (
    <>
      <button type="button" onClick={toggle}>
        {state ? 'unmount' : 'mount'}
      </button>
      {state && <MyComponent />}
    </>
  );
};

在组件未加载时显示mount,组件加载后,点击显示unmount

image.png

接下来一起看下 源码

源码

1.使用useLatest包裹住传入的函数fn

 const fnRef = useLatest(fn);

2.在useEffect中的return 中执行函数,表示卸载时执行函数

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

2.源码里做了个判断,判断是否是开发环境,如果是开发环境,并且传入的参数不是一个函数,则直接报错

if (isDev) {
    if (!isFunction(fn)) {
      console.error(
        `useMount: parameter \`fn\` expected to be a function, but got "${typeof fn}".`,
      );
    }
  }

其他hooks

useLatest

useEventListener

useClickAway

useDocumentVisibility

useTitle