ReactJS Hook 模式 ~useEffectEvent 模式~

发布: (2026年1月19日 GMT+8 14:59)
2 min read
原文: Dev.to

Source: Dev.to

Overview

useEffectEventReact 19 中引入。该 Hook 让你能够在 effect 中访问最新的 props 或 state 值,而不会导致 effect 重新执行。
在 React 中,一个常见的问题是当值被写入依赖数组时会触发不必要的重新渲染。useEffectEvent 通过将这些值从依赖数组中抽离出来,并作为回调函数的参数传入,从而解决了这个问题。

Example

import { useState, useEffect, useEffectEvent } from "react";

function trackPage(url, itemCount) {
  console.log(`Url: ${url} | Items in cart: ${itemCount}`);
}

function Page({ url }) {
  const [itemCount, setItemCount] = useState(0);

  // useEffectEvent gives access to the latest `itemCount` without
  // needing to list it in the effect dependencies.
  const onVisit = useEffectEvent(() => trackPage(url, itemCount));

  useEffect(() => {
    onVisit();
  }, [url]); // `itemCount` is omitted from the dependency array

  return (
    <div>
      <h2>Current Page: {url}</h2>
      <p>Items in cart: {itemCount}</p>
      <button onClick={() => setItemCount(itemCount + 1)}>
        Add Item to Cart
      </button>
      <button
        onClick={() => setItemCount(0)}
        disabled={itemCount === 0}
      >
        Clear Cart
      </button>
    </div>
  );
}

function App() {
  const [url, setUrl] = useState("/home");

  return (
    <div>
      <button onClick={() => setUrl("/home")}>Home</button>
      <button onClick={() => setUrl("/cart")}>Cart</button>
      <button onClick={() => setUrl("/about")}>About</button>
      <Page url={url} />
    </div>
  );
}

export default App;
Back to Blog

相关文章

阅读更多 »