選單
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

React useEffect Hook


useEffect Hook 允許您在元件中執行副作用。

一些副作用的例子是:獲取資料、直接更新 DOM 和計時器。

useEffect 接受兩個引數。第二個引數是可選的。

useEffect(<函式>, <依賴項>)


讓我們以計時器為例。

示例

使用 setTimeout() 在初始渲染後計時 1 秒

import { useState, useEffect } from "react";
import ReactDOM from "react-dom/client";

function Timer() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    setTimeout(() => {
      setCount((count) => count + 1);
    }, 1000);
  });

  return <h1>I've rendered {count} times!</h1>;
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Timer />);

執行示例 »

但等等!!它還在繼續計數,即使它應該只計數一次!

useEffect 在每次渲染時執行。這意味著當計數改變時,會發生渲染,然後觸發另一個效果。

這不是我們想要的。有幾種方法可以控制副作用何時執行。

我們應該始終包含第二個引數,它接受一個數組。我們可以選擇性地在此陣列中將依賴項傳遞給 useEffect

示例

1. 未傳遞依賴項

useEffect(() => {
  //Runs on every render
});

示例

2. 一個空陣列

useEffect(() => {
  //Runs only on the first render
}, []);

示例

3. Props 或 state 值

useEffect(() => {
  //Runs on the first render
  //And any time any dependency value changes
}, [prop, state]);

所以,為了解決這個問題,我們只在初始渲染時執行此效果。

示例

僅在初始渲染時執行效果

import { useState, useEffect } from "react";
import ReactDOM from "react-dom/client";

function Timer() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    setTimeout(() => {
      setCount((count) => count + 1);
    }, 1000);
  }, []); // <- add empty brackets here

  return <h1>I've rendered {count} times!</h1>;
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Timer />);

執行示例 »

示例

這是一個依賴於變數的 useEffect Hook 的示例。如果 count 變數更新,效果將再次執行

import { useState, useEffect } from "react";
import ReactDOM from "react-dom/client";

function Counter() {
  const [count, setCount] = useState(0);
  const [calculation, setCalculation] = useState(0);

  useEffect(() => {
    setCalculation(() => count * 2);
  }, [count]); // <- add the count variable here

  return (
    <>
      <p>Count: {count}</p>
      <button onClick={() => setCount((c) => c + 1)}>+</button>
      <p>Calculation: {calculation}</p>
    </>
  );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Counter />);

執行示例 »

如果有多個依賴項,應將它們包含在 useEffect 依賴項陣列中。


w3schools CERTIFIED . 2022

獲得認證!

完成 React 模組,完成練習,參加考試,並獲得 w3schools 認證!

$95 註冊

效果清理

某些效果需要清理以減少記憶體洩漏。

不應再使用的超時、訂閱、事件監聽器和其他效果應被丟棄。

我們透過在 useEffect Hook 末尾包含一個返回函式來做到這一點。

示例

useEffect Hook 末尾清理計時器

import { useState, useEffect } from "react";
import ReactDOM from "react-dom/client";

function Timer() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    let timer = setTimeout(() => {
    setCount((count) => count + 1);
  }, 1000);

  return () => clearTimeout(timer)
  }, []);

  return <h1>I've rendered {count} times!</h1>;
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Timer />);

執行示例 »

注意: 要清除計時器,我們必須為其命名。



×

聯絡銷售

如果您想將 W3Schools 服務用於教育機構、團隊或企業,請傳送電子郵件給我們
sales@w3schools.com

報告錯誤

如果您想報告錯誤,或想提出建議,請傳送電子郵件給我們
help@w3schools.com

W3Schools 經過最佳化,旨在方便學習和培訓。示例可能經過簡化,以提高閱讀和學習體驗。教程、參考資料和示例會不斷審查,以避免錯誤,但我們無法保證所有內容的完全正確性。使用 W3Schools 即表示您已閱讀並接受我們的使用條款Cookie 和隱私政策

版權所有 1999-2024 Refsnes Data。保留所有權利。W3Schools 由 W3.CSS 提供支援