React的 useEffect第二个参数传空数组和vue的onMounted在执行时机上,有什么区别

685 阅读3分钟

React 的 useEffect 钩子和 Vue 的 onMounted 钩子在执行时机上有一些相似之处,但也存在一些细微的差异。以下是详细的比较和解释:

React 的 useEffect

在 React 中,useEffect 是一个用于在函数组件中执行副作用(如数据获取、订阅或手动更改 DOM)的方法。useEffect 接受两个参数:

  1. 第一个参数:一个回调函数,这个函数会在组件渲染后执行。
  2. 第二个参数:一个依赖数组,决定了何时重新执行第一个参数的回调函数。

如果第二个参数是一个空数组([]),useEffect 的回调函数只会在组件挂载(mount)和卸载(unmount)时执行一次。

import React, { useEffect } from 'react';

function MyComponent() {
  useEffect(() => {
    // 组件挂载时执行
    console.log('Component mounted');

    // 组件卸载时执行
    return () => {
      console.log('Component unmounted');
    };
  }, []); // 空数组,意味着只在挂载和卸载时执行

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

Vue 的 onMounted

在 Vue 3 中,onMounted 是一个组合式 API 钩子,用于在组件挂载(mount)时执行代码。它类似于 Vue 2 中的 mounted 钩子。

import { onMounted } from 'vue';

export default {
  setup() {
    onMounted(() => {
      // 组件挂载时执行
      console.log('Component mounted');
    });

    return {};
  }
}

执行时机上的比较

共同点

  1. 挂载时执行:两者都会在组件挂载时执行一次。
  2. 卸载时清理:在 React 的 useEffect 回调函数中返回的函数会在组件卸载时执行,用于清理副作用。Vue 也有类似的机制,可以在 onUnmounted 钩子中进行清理。

不同点

  1. 依赖数组:React 的 useEffect 可以通过依赖数组来控制副作用的执行频率和时机。如果依赖数组为空([]),则只在组件挂载和卸载时执行一次。而 Vue 的 onMounted 钩子没有类似的依赖数组机制,它只会在组件挂载时执行一次。

  2. 执行顺序

    • 在 React 中,useEffect 的回调函数会在浏览器完成布局和绘制之后异步执行。这意味着它不会阻塞浏览器的绘制过程。
    • 在 Vue 中,onMounted 钩子会在组件的 DOM 已经插入到页面后同步执行。
  3. 多次调用

    • React 的 useEffect 可以在一个组件中多次调用,每个 useEffect 都可以有自己的依赖数组和清理函数。
    • Vue 的 onMounted 只能在组件的生命周期中调用一次,但可以在 setup 函数中调用多个组合式 API 钩子来实现类似的效果。

实例比较

React 实例

import React, { useEffect } from 'react';

function MyComponent() {
  useEffect(() => {
    console.log('Component mounted');
    return () => {
      console.log('Component unmounted');
    };
  }, []);

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

Vue 实例

import { onMounted } from 'vue';

export default {
  setup() {
    onMounted(() => {
      console.log('Component mounted');
    });

    return {};
  }
}
  • React 的 useEffect:通过依赖数组控制副作用的执行时机,回调函数在组件挂载后异步执行,并且可以在一个组件中多次调用。
  • Vue 的 onMounted:在组件挂载时同步执行,没有依赖数组机制,只能在组件生命周期中调用一次。

这两者在执行时机上有一些细微的区别,但总体上都是用于在组件挂载时执行某些操作。选择使用哪种钩子取决于你使用的框架和具体的需求。