Реактивная навигация с пользовательским React-хуком

JavaScriptJavaScriptIntermediate
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь создавать пользовательский React-хук под названием useWindowSize, чтобы получить текущий размер окна и использовать его для условного рендеринга панели навигации в веб-приложении.

👀 Предпросмотр

предпросмотр проекта

🎯 Задачи

В этом проекте вы научитесь:

  • Реализовать пользовательский хук useWindowSize, чтобы получить текущий размер окна
  • Использовать хук useWindowSize в компоненте App, чтобы обновить панель навигации в зависимости от ширины окна

🏆 Достижения

После завершения этого проекта вы сможете:

  • Создать пользовательский React-хук для encapsulation повторно используемой функциональности
  • Использовать хуки useState и useEffect для управления состоянием и побочными эффектами
  • Условно рендерить компоненты в зависимости от текущего размера окна

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL react(("React")) -.-> react/AdvancedConceptsGroup(["Advanced Concepts"]) javascript(("JavaScript")) -.-> javascript/AdvancedConceptsGroup(["Advanced Concepts"]) react(("React")) -.-> react/StateManagementGroup(["State Management"]) javascript(("JavaScript")) -.-> javascript/DOMManipulationGroup(["DOM Manipulation"]) react(("React")) -.-> react/FundamentalsGroup(["Fundamentals"]) react/FundamentalsGroup -.-> react/event_handling("Handling Events") react/FundamentalsGroup -.-> react/conditional_render("Conditional Rendering") react/AdvancedConceptsGroup -.-> react/hooks("React Hooks") javascript/AdvancedConceptsGroup -.-> javascript/higher_funcs("Higher-Order Functions") react/StateManagementGroup -.-> react/use_state_reducer("Using useState and useReducer") javascript/DOMManipulationGroup -.-> javascript/dom_manip("DOM Manipulation") javascript/DOMManipulationGroup -.-> javascript/event_handle("Event Handling") subgraph Lab Skills react/event_handling -.-> lab-300136{{"Реактивная навигация с пользовательским React-хуком"}} react/conditional_render -.-> lab-300136{{"Реактивная навигация с пользовательским React-хуком"}} react/hooks -.-> lab-300136{{"Реактивная навигация с пользовательским React-хуком"}} javascript/higher_funcs -.-> lab-300136{{"Реактивная навигация с пользовательским React-хуком"}} react/use_state_reducer -.-> lab-300136{{"Реактивная навигация с пользовательским React-хуком"}} javascript/dom_manip -.-> lab-300136{{"Реактивная навигация с пользовательским React-хуком"}} javascript/event_handle -.-> lab-300136{{"Реактивная навигация с пользовательским React-хуком"}} end

Реализация хука useWindowSize

Для начала откройте редактор. Вы можете увидеть следующие файлы в редакторе.

├── package-lock.json
├── package.json
├── public
│   ├── index.html
│   └── robots.txt
└── src
    ├── App.css
    ├── App.js
    ├── hooks
    │   └── useWindowSize.js
    ├── index.css
    ├── index.js
    ├── reportWebVitals.js
    └── setupTests.js

В этом шаге вы научитесь реализовывать пользовательский хук useWindowSize, чтобы получить текущий размер окна.

  1. Откройте файл useWindowSize.js, расположенный в директории src/Hooks.
  2. В этом файле импортируйте необходимые зависимости:
import { useEffect, useState } from "react";
  1. Определите функцию useWindowSize:
import { useEffect, useState } from "react";

export const useWindowSize = () => {
  const [windowSize, setWindowSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight
  });

  const changeWindowSize = () => {
    setWindowSize({ width: window.innerWidth, height: window.innerHeight });
  };

  useEffect(() => {
    window.addEventListener("resize", changeWindowSize);

    return () => {
      window.removeEventListener("resize", changeWindowSize);
    };
  }, []);

  return windowSize;
};

Пояснение:

  • Функция useWindowSize возвращает объект, содержащий текущую ширину и высоту окна.
  • Хуки useState используется для создания переменной состояния windowSize и функции setWindowSize для ее обновления.
  • Функция changeWindowSize определена для обновления состояния windowSize при изменении размера окна.
  • Хуки useEffect используется для добавления слушателя события resize и удаления его при отмонтировании компонента.
  • Объект windowSize возвращается из функции useWindowSize.

Тестирование приложения

  1. Сохраните файл useWindowSize.js.
  2. Загрузите зависимости с помощью команды npm install в терминале, подождите, пока зависимости будут загружены, а затем запустите проект с помощью команды npm start.
  3. Как только проект успешно запустится, нажмите на "Web 8080", чтобы просмотреть его в браузере.
  4. Эффект заключается в том, что при изменении размера окна пользователем нижний контент будет отображать ширину окна, а верхняя панель навигации будет скрывать два подменю на маленьких экранах и показывать три меню на больших экранах.
демонстрация навигации при изменении размера окна

Поздравляем! Вы успешно реализовали хук useWindowSize и использовали его в компоненте App для обновления панели навигации в зависимости от размера окна.

✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.