0Pricing
React Academy · Lekcja

Refaktoryzacja HOC do Custom Hooka

Stopniowa konwersja HOC withAuth na hook useAuth.

Refaktoryzacja HOC do Custom Hooka to bezpłatna lekcja React Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Witamy

W tej lekcji krok po kroku przekształcą Państwo HOC withAuth w custom hook useAuth i dokładnie zobaczą, dlaczego wersja z hookiem jest przejrzystsza oraz łatwiejsza do testowania.

HOC withAuth (punkt wyjścia)

HOC przyjmuje komponent, sprawdza, czy użytkownik jest uwierzytelniony, i w razie potrzeby przekierowuje go do /login. Wstrzykuje użytkownika jako właściwość.
function withAuth(Component) {
  return function AuthGuard(props) {
    const { user, loading } = useAuthState();
    if (loading) return <Spinner />;
    if (!user) return <Navigate to="/login" />;
    return <Component {...props} user={user} />;
  };
}

const ProtectedPage = withAuth(MyPage);

Problemy związane z HOC

HOC: (1) dodaje wrapper w DevTools, (2) niejawnie wstrzykuje właściwość `user` — komponent musi wiedzieć, że ma jej oczekiwać, (3) trudno go testować bez renderowania całego wrappera HOC, (4) nie można go łatwo komponować z innymi hookami.

Krok 1: Wydzielenie logiki do hooka

Należy przenieść całą logikę z HOC do custom hooka. Hook zwraca stan uwierzytelniania bezpośrednio — bez opakowywania i wstrzykiwania właściwości.
function useAuth() {
  const { user, loading } = useAuthState();
  return { user, loading, isAuthenticated: !!user };
}

Krok 2: Obsługa przekierowań w hooku

Należy przenieść logikę przekierowania do osobnego hooka (np. useRequireAuth), który wewnętrznie wywołuje navigate i zwraca użytkownika.
function useRequireAuth(redirectTo = '/login') {
  const { user, loading } = useAuth();
  const navigate = useNavigate();

  useEffect(() => {
    if (!loading && !user) navigate(redirectTo);
  }, [user, loading, navigate, redirectTo]);

  return { user, loading };
}

Krok 3: Aktualizacja komponentu

Należy zastąpić wrapper HOC bezpośrednim wywołaniem hooka wewnątrz komponentu. Komponent jawnie wywołuje useRequireAuth i obsługuje stan ładowania. Jego zależność jest teraz widoczna.
function MyPage() {
  const { user, loading } = useRequireAuth();
  if (loading) return <Spinner />;
  return <p>Hello, {user.name}</p>;
}

Porównanie korzyści

Wersja z hookiem: (1) nie ma dodatkowego wrappera w DevTools, (2) ma jawną zależność — w komponencie widać `useRequireAuth`, (3) można ją testować przez zamockowanie hooka, (4) można ją komponować z innymi hookami w tym samym komponencie.

Testowanie wersji z hookiem

W teście należy zamockować useRequireAuth, zastępując eksport jego modułu. Test komponentu musi jedynie wyrenderować komponent i sprawdzić wynik — konfiguracja HOC nie jest potrzebna.
vi.mock('./useRequireAuth', () => ({
  useRequireAuth: () => ({ user: mockUser, loading: false })
}));

render(<MyPage />);
expect(screen.getByText('Hello, Alice')).toBeInTheDocument();

Kiedy zachować HOC

HOC warto zachować, jeśli trzeba deklaratywnie chronić wiele komponentów (np. w definicjach tras) i nie chcą Państwo dodawać wywołania hooka do każdego z nich. Można nawet zbudować HOC NA BAZIE hooka.
function withAuth(Component) {
  return function (props) {
    const { user, loading } = useRequireAuth();
    if (loading) return <Spinner />;
    return <Component {...props} user={user} />;
  };
}

Najlepsze rozwiązanie z obu podejść

Końcowa architektura: hook useRequireAuth do bezpośredniego użycia w komponentach ORAZ cienki HOC withAuth zbudowany na jego podstawie do deklaratywnej ochrony tras. Oba rozwiązania współdzielą tę samą logikę hooka.

Szybkie sprawdzenie

Jaka jest główna korzyść z wywoływania useRequireAuth wewnątrz komponentu zamiast opakowywania go za pomocą HOC withAuth?

Podsumowanie

Aby przekształcić HOC w hook, należy wydzielić logikę do custom hooka, przenieść efekty uboczne (takie jak przekierowania) do hooka i wywoływać hook bezpośrednio w komponencie. Gdy potrzebne jest deklaratywne opakowywanie, należy zbudować cienki HOC na podstawie hooka.

Kurs ukończony

Gratulacje! Ukończyli Państwo kurs **React Patterns: Render Props & HOCs**. Rozumieją już Państwo oba klasyczne wzorce, ich kompromisy oraz sposób przekształcania ich we współczesne custom hooks.

Często zadawane pytania

Czy lekcja „Refaktoryzacja HOC do Custom Hooka” jest bezpłatna?

Tak — pełny tekst „Refaktoryzacja HOC do Custom Hooka” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Refaktoryzacja HOC do Custom Hooka”?

Stopniowa konwersja HOC withAuth na hook useAuth. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Refaktoryzacja HOC do Custom Hooka”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wzorzec Render Props
  2. Komponenty wyższego rzędu (HOC) — wyjaśnienie
  3. HOC a Render Props i Custom Hooks
  4. Refaktoryzacja HOC do Custom Hooka
← Powrót do React Academy