在 React 中,useEffectuseLayoutEffect 都是用來處理副作用的 Hook。它們在功能上相似,但執行時機不同,這導致它們在某些情況下有不同的應用場景。

useEffect

import React, { useEffect } from 'react';

function MyComponent() {
  useEffect(() => {
    // 執行副作用,例如資料請求
    fetch('/api/data')
      .then(response => response.json())
      .then(data => console.log(data));

    // 清除副作用
    return () => {
      // 清除訂閱或計時器
    };
  }, []); // 依賴陣列為空,表示這個 effect 只會在元件掛載和卸載時執行

  return <div>My Component</div>;
}

useLayoutEffect

import React, { useLayoutEffect, useRef } from 'react';

function MyComponent() {
  const divRef = useRef(null);

  useLayoutEffect(() => {
    // 讀取和操作 DOM
    const { height } = divRef.current.getBoundingClientRect();
    console.log('Height:', height);

    // 清除副作用
    return () => {
      // 清除可能的 DOM 操作
    };
  }, []); // 依賴陣列為空,表示這個 effect 只會在元件掛載和卸載時執行

  return <div ref={divRef}>My Component</div>;
}

總結

面試考題

  1. 什麼是 useEffect?它的執行時機是什麼?
  2. 什麼是 useLayoutEffect?它的執行時機是什麼?
  3. useEffectuseLayoutEffect 的主要差異是什麼?
  4. 什麼時候應該使用 useLayoutEffect 而不是 useEffect