iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

考量到在多頁面上放置相同的 GraphQL 查詢語句不僅閱讀起來繁瑣,維護上也不方便,因此,我決定將這些查詢語句抽離成自訂的 hook。

我對於 hook 認知
hook 是一種能夠在不同頁面中共用相同邏輯的方式。在開發者的藍圖設計中,如果多個元件中有相同的邏輯,可以考慮將其抽離成獨立的函數,這樣可以提升代碼的可讀性和可維護性。

步驟
1.在 Next.js 專案目錄 src 下建立一個名為 apollo 的目錄,並在其中再創建一個 hooks 資料夾。根據各功能性或頁面,可以創建不同的子層目錄。

2.在命名上,依照慣例,hook 檔案會以 use 為起頭。例如,假設我在首頁有一個 API Mutation Signin。

如以下步驟:

# 創建目錄結構
mkdir -p src/apollo/hooks

# 創建一個 custom hook 檔案
touch src/apollo/hooks/useSignin.js

3.在 useSignin.js 中,撰寫自訂 hook:

import { useMutation } from '@apollo/client';
import { SIGNIN_MUTATION } from '../mutations/signinMutation';

const useSignin = () => {
  const [signin, { data, loading, error }] = useMutation(SIGNIN_MUTATION);

  return {
    signin,
    data,
    loading,
    error
  };
};

export default useSignin;

這樣,我們就能在任何需要使用 Signin Mutation 的頁面或元件中,簡單地引入和使用這個 custom hook。

import useSignin from '../apollo/hooks/useSignin';

const SigninPage = () => {
  const { signin, data, loading, error } = useSignin();

  const handleSignin = async () => {
    try {
      await signin({ variables: { email: 'example@example.com', password: 'password' } });
    } catch (err) {
      console.error(err);
    }
  };

  return (
    <div>
      <button onClick={handleSignin}>Sign In</button>
      {loading && <p>Loading...</p>}
      {error && <p>Error: {error.message}</p>}
      {data && <p>Signed in successfully!</p>}
    </div>
  );
};

export default SigninPage;

透過這種方式,我們可以將重複的邏輯抽離,並且提升代碼的可維護性和可讀性。


上一篇
[Day 18] 表單套件使用
下一篇
[Day 20] 表單結合 Schema Validation ZOD
系列文
用 Next.js 實作屋況查詢評估專家網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言