
Custom Hooks 的核心概念是可重用性,在 React 中,我們可以將可重用的邏輯封裝成 Custom Hooks,這樣一來,就可以在多個元件之間重用這些邏輯片段。
首先讓我們定義一個函式,並確保函式名稱以 use 開頭,接著,我們可以在函式內部使用 React 的內建 Hooks,並定義要封裝的邏輯。
通常會在最後返回一個陣列或是物件,其中包含我們希望元件能夠訪問的狀態或函式。
// Custom Hooks 名為 useMovies
function useMovies(query) {
  const [movies, setMovies] = useState([]);
  const [isLoading, setIsLoading] = useState(false);
  useEffect(() => {
    async function fetchMovies() {
      setIsLoading(true);
      const json = await fetch(`http://www.omdbapi.com/s=${query}`);
      const data = await json.json();
      setMovies(data);
      setIsLoading(false);
    }
    fetchMovies();
  }, [query]);
  // 將希望重用的狀態或函式返回
  return {
    movies,
    isLoading
  };
}
接著我們就可以使用 useMovies 這個 Custom Hooks。
function App() {
  const [query, setQuery] = useState("");
  const { movies, isLoading } = useMovies(query);
}
如果我們想要重用 UI 元件,我們知道可以使用 React 元件,但如果我們想要重用 React 中的邏輯,首先需要問自己一個問題:想要重用的邏輯是否包含任何 React Hooks?如果不包含,我們只需使用一個常規的函式。
如果邏輯包含任何 React Hooks,則不能將該邏輯單獨提取到常規函式中,而是需要創建一個 Custom Hooks。
常規函式(沒有包含任何 React Hooks)
function sum(a, b) {
  return a + b;
}
Custom Hooks(包含 React Hooks)
function useCount(value) {
  const [count, setCount] = useState(value);
  function handleDecrement() {
    setCount((count) => count - 1);
  }
  function handleIncrement() {
    setCount((count) => count + 1);
  }
  return {
    count,
    handleDecrement,
    handleIncrement
  };
}
Custom Hooks 可以提高程式碼的可重用性和可維護性。通過將常見的邏輯片段封裝到 Custom Hooks 中,我們可以在整個專案中重用這些邏輯。
這邊要特別注意,Custom Hooks 的名稱必須以 use 開頭,以便 React 區分一般函式跟 Custom Hooks。