רוצים להשתלב בתעשיית ההייטק?למסלולי הכשרה ב-Full Stack, סייבר ו-AI לחצו כאן
React logo

Custom Hooks — מדריך עם דוגמאות חיות

מה זה Custom Hook ולמה להשתמש?

Custom Hook הוא פונקציה שמתחילה ב-use ומאפשרת לאגד לוגיקת Hooks לשימוש חוזר בין קומפוננטות. לדוגמה: נראות/הסתרה (toggle), שליפת נתונים (fetch), דיבאונס/תזמון, ניהול מאזינים ועוד — תוך שמירה על חוקי Hooks ועל קוד נקי וקריא.

חוקי זהב

  • ה-Hook חייב להתחיל בשם use.
  • מותר לקרוא ל-Hooks רק ברמה העליונה של ה-Hook (לא בתוך תנאי/לולאה).
  • כל תלות שמופיעה בלוגיקת ה-Hook חייבת להופיע במערכי התלותים.
  • שמרו על ממשק פשוט וברור: החזירו אובייקט/טופל קטן עם מה שבאמת צריך.
  • פרקו לוגיקות: עדיף כמה Hooks קטנים מאשר מפלצת אחת.

תוכן עניינים

  1. useToggle — מתג נראות
  2. useFetch — שליפת נתונים כללית
  3. useFetchPerson — וריאציה ייעודית
  4. טיפים, אנטי-פטרנים ומבנה מומלץ

1) useToggle — מתג נראות

Hook קטן לניהול בוליאן (נראות/הסתרה). שימושי לטוגלים, מודלים, אקורדיון וכד'.

import { useState } from 'react';

function useToggle(defaultValue = false) {
  const [value, setValue] = useState(!!defaultValue);
  const toggle = () => setValue(v => !v);
  const on = () => setValue(true);
  const off = () => setValue(false);
  return { value, toggle, on, off };
}

export default useToggle;

דוגמה חיה

toggle custom hook

some stuff

קוד הדוגמה

import useToggle from './useToggle';

function ToggleExample() {
  const { value: show, toggle } = useToggle(true);
  return (
    <div>
      <h4>toggle custom hook</h4>
      <button className='btn' onClick={toggle}>toggle</button>
      {show && <h4>some stuff</h4>}
    </div>
  );
}

export default ToggleExample;

2) useFetch — שליפת נתונים עם Multiple Returns

Hook כללי שמחזיר isLoading, isError, data. מטפל ב-AbortController וניקיון, ובנוי לפי סדר Loading → Error → Success.

import { useState, useEffect } from 'react';

function useFetch(url, options = {}) {
  const [isLoading, setIsLoading] = useState(true);
  const [isError,   setIsError]   = useState(false);
  const [data,      setData]      = useState(null);

  useEffect(() => {
    if (!url) { setIsError(true); setIsLoading(false); return; }
    const ctrl = new AbortController();

    (async () => {
      try {
        const res = await fetch(url, { signal: ctrl.signal, ...options });
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        const json = await res.json();
        setData(json);
      } catch (err) {
        if (err.name !== 'AbortError') setIsError(true);
      } finally {
        setIsLoading(false);
      }
    })();

    return () => ctrl.abort();
  }, [url]); // בכוונה תלוי רק ב-url, אפשר להרחיב ל-options אם יציב

  return { isLoading, isError, data };
}

export default useFetch;

דוגמה חיה — פרופיל GitHub (QuincyLarson)

⌛ Loading…

קוד הדוגמה

import useFetch from './useFetch';

const url = 'https://api.github.com/users/QuincyLarson';

function FetchData() {
  const { isLoading, isError, data: user } = useFetch(url);

  if (isLoading) return <h2>Loading...</h2>;
  if (isError)   return <h2>There was an error...</h2>;

  const { avatar_url, name, company, bio } = user || {};
  return (
    <div>
      <img style={{ width: 150, borderRadius: 25 }} src={avatar_url} alt={name} />
      <h2>{name}</h2>
      {company && <h4>works at {company}</h4>}
      <p>{bio}</p>
    </div>
  );
}

export default FetchData;
⚠️ GitHub API מוגבל בקצב קריאות ללא טוקן. אם נתקלים ב-rate limit, אפשר להעביר headers עם טוקן, או להחליף כתובת API.

3) useFetchPerson — וריאציה ממוקדת לאובייקט "משתמש"

אותה לוגיקה, אך עם state ממוקד בשם user להבהרת הכוונה בקומפוננטה הקוראת.

import { useState, useEffect } from 'react';

function useFetchPerson(url) {
  const [isLoading, setIsLoading] = useState(true);
  const [isError,   setIsError]   = useState(false);
  const [user,      setUser]      = useState(null);

  useEffect(() => {
    if (!url) { setIsError(true); setIsLoading(false); return; }
    const ctrl = new AbortController();

    (async () => {
      try {
        const res = await fetch(url, { signal: ctrl.signal });
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        const json = await res.json();
        setUser(json);
      } catch (err) {
        if (err.name !== 'AbortError') setIsError(true);
      } finally {
        setIsLoading(false);
      }
    })();

    return () => ctrl.abort();
  }, [url]);

  return { isLoading, isError, user };
}

export default useFetchPerson;

דוגמה חיה — אותו היוזר עם Hook ייעודי

⌛ Loading…

טיפים ודגשים

  • הוציאו מה-Hook רק מה שבאמת צריך — שמרו על API קטן.
  • אל תחשפו setState גולמי אם אין צורך — החזירו פעולות (כמו toggle/on/off).
  • ל-fetch: צרפו ניקוי עם AbortController, וטפלו ב-!res.ok.
  • התאימו את מערכי התלותים כך שה-Hook יהיה צפוי ולא יפתיע בריצות מיותרות.
  • שקלו פיצול ל-Hooks קטנים נפרדים במקום Hook ענק עם הרבה מצבים.

למה ללמוד תכנות וסייבר ב-More-ways?

עולם הטכנולוגיה משתנה במהירות, והיום כבר לא מספיק רק לדעת לכתוב קוד. ב-More-ways אנחנו מאמינים בשילוב קריטי בין פיתוח Full-Stack, הבנת ארכיטקטורת רשתות, ושימוש מתקדם ב-בינה מלאכותית (AI). המדריך שלפניכם הוא רק טעימה מהידע המקצועי שאנו מעבירים בקורסים שלנו, הכוללים ליווי אישי, פרויקטים מעשיים והכנה לשוק העבודה המודרני.

האם אפשר ללמוד תכנות ללא ניסיון?

בוודאי. המסלולים שלנו ב-More-ways מונגשים גם למתחילים, עם דגש על חשיבה לוגית ובניית בסיס איתן לפני הצלילה לקוד המורכב.

איך AI משתלב בלימודי הייטק?

אנחנו מלמדים אתכם להשתמש בכלי AI כדי להאיץ את הפיתוח, לדבג קוד ביעילות ולבנות אפליקציות חכמות יותר בזמן קצר יותר.

מוכנים לקחת את הקריירה לשלב הבא?

מעבר לאתר More-ways הרשמי