Skip to content

useMount

只在组件初始化时执行的 Hook。

基础用法

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

tsx
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 />}
    </>
  );
};

使用场景

  • 页面初始化
  • 组件初始化

实际场景

页面初始化旧写法

例如想在页面初始化时打印123,具体代码如下:

tsx
import { useEffect } from "react";
import type { FC } from "react";

// 基础用法
const Simple: FC = () => {
  useEffect(() => {
    console.log(123);
  }, []);

  return <button>21123123</button>;
};

页面初始化新写法

同理如果使用useMount时,主体代码不变,将useEffect替换为useMount,且不再需要依赖项,具体代码如下:

tsx
import { useMount } from "ahooks";
import type { FC } from "react";

// 基础用法
const Simple: FC = () => {
  useMount(() => {
    console.log(123);
  });

  return <button>21123123</button>;
};

ahooks 源代码

tsx
import { useEffect } from "react";
import { isFunction } from "../utils";
import isDev from "../utils/isDev";

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

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

export default useMount;

在源代码中isDev用于检测环境是否为开发环境,如果是开发环境且fn不为函数(isFunction用于检测变量是否为函数)时提醒开发者错误

fn?.()防止用户传入的变量不为函数时报错导致页面白屏