Откройте для себя силу хука useState в React для легкого управления состоянием компонента. с помощью useState вы можете легко создавать и обновлять переменные состояния, обеспечивая динамические и взаимодействующие пользовательские интерфейсы. Узнайте, как использовать простоту и гибкость хука useState для улучшения ваших приложений React.
Хук useState — это хук React, который позволяет вам управлять состоянием в функциональных компонентах. Это очень мощный инструмент, который можно использовать для создания сложных и динамичных пользовательских интерфейсов.
Что такое государство
- Состояние — это любые данные, которые со временем изменяются в вашем приложении. Например, количество товаров в корзине или текущее значение текстового ввода являются примерами состояния.
Как работает useState?
Хук useState принимает два аргумента: начальное значение состояния и функцию для обновления состояния. Хук возвращает массив с двумя значениями: текущее значение состояния и функцию для обновления состояния.
Например, следующий код создает переменную состояния с именем counter
и инициализирует ее значением 0:
const [counter, setCounter] = useState(0);
Затем можно использовать переменную counter
для доступа к текущему значению счетчика, а функцию setCounter
можно использовать для обновления значения счетчика.
Плюсы использования состояния
Состояние управляется в функциональных компонентах, что делает код более пригодным для повторного использования и более простым для тестирования.
Состояние можно обновить без создания нового компонента.
Состояние автоматически запоминается, что предотвращает ненужные повторные рендеры.
Минусы использования состояния
Состоянием может быть трудно управлять, особенно в сложных приложениях.
Состояние может быть источником ошибок, если оно используется неправильно.
Состояние может замедлить работу вашего приложения, если оно используется неэффективно.
Пример.В следующем коде показан пример использования обработчика useState для создания простого счетчика:
import React, { useState } from 'react'; const Counter = () => { // Declare a state variable called "count" and initialize it to 0 const [count, setCount] = useState(0); // Event handler to increment the count const increment = () => { setCount(count + 1); // Update the count state }; // Event handler to decrement the count const decrement = () => { setCount(count - 1); // Update the count state }; return ( <div> <h2>Counter: {count}</h2> <button onClick={increment}>Increment</button> <button onClick={decrement}>Decrement</button> </div> ); }; export default Counter;
Теперь давайте рассмотрим пример, чтобы понять его более подробно:
Мы получим пример профиля Github.
Если бы код писался вместе и комментировался, а не по отдельности, разделы было бы легче понять.
import React, { useState, useEffect } from 'react'; import './Style.css'; const GitHubProfile = () => { const [username, setUsername] = useState(''); // State for storing the entered GitHub username const [userData, setUserData] = useState(null); // State for storing the user data fetched from API const [isLoading, setIsLoading] = useState(false); // State for tracking the loading state const [error, setError] = useState(null); // State for storing any error that occurs during API fetch const [repositories, setRepositories] = useState([]); // State for storing the fetched repositories useEffect(() => { const fetchUserData = async () => { try { setIsLoading(true); const response = await fetch(`https://api.github.com/users/${username}`); const data = await response.json(); setUserData(data); // Update the user data state with the fetched data setIsLoading(false); } catch (error) { setError(error.message); // Update the error state if an error occurs during API fetch setIsLoading(false); } }; const fetchRepositories = async () => { try { setIsLoading(true); const response = await fetch(`https://api.github.com/users/${username}/repos`); const data = await response.json(); setRepositories(data); // Update the repositories state with the fetched data setIsLoading(false); } catch (error) { setError(error.message); // Update the error state if an error occurs during API fetch setIsLoading(false); } }; if (username) { fetchUserData(); // Fetch user data if a username is provided fetchRepositories(); // Fetch repositories if a username is provided } }, [username]); const handleSearch = () => { setError(null); setUserData(null); setRepositories([]); if (username) { setUsername(username); // Set the entered username as the state value } else { setError('Please enter a username'); // Display an error if no username is entered } }; return ( <div className="container"> <h2>GitHub Profile</h2> <div className="search"> <input type="text" value={username} onChange={(e) => setUsername(e.target.value)} placeholder="Enter GitHub username" /> <button onClick={handleSearch}>Search</button> </div> {isLoading && <p>Loading...</p>} {/* Display a loading message if the API request is in progress */} {error && <p>Error: {error}</p>} {/* Display an error message if an error occurs during API fetch */} <div className="profile-repo-section"> {userData && ( <div className="profile-section"> <div className="card"> <h3>{userData.login}</h3> <img src={userData.avatar_url} alt="Avatar" className="avatar" /> <p>Followers: {userData.followers}</p> <p>Repositories: {userData.public_repos}</p> </div> </div> )} {repositories.length > 0 && ( <div className="repositories-section"> <h4>Repositories:</h4> <div className="repo-list"> {repositories.map((repo) => ( <div key={repo.id} className="repository"> <p>{repo.name}</p> </div> ))} </div> </div> )} </div> </div> ); }; export default GitHubProfile;
Давайте разберемся во всех шагах кода:
Импорт зависимостей и CSS:
- Мы импортируем
necessary dependencies
, React, useState, useEffect и файл CSS, содержащий стили для нашего компонента.
Функциональный компонент:
- Мы определяем функциональный компонент с именем
GitHubProfile
, который представляет нашGitHub profile display
.
Инициализация состояния:
- Мы инициализируем
multiple state variables
с помощьюuseState hook
: username to store the entered GitHub username.
- userData для хранения пользовательских данных, полученных из GitHub API.
isLoading
для отслеживания состояния загрузки приfetching
данных.- error для хранения любой ошибки, возникающей во время
API
fetch
. - репозитории для хранения файлов
fetched
repositories
.
Крюк с эффектом:
- Мы используем хук
useEffect
для извлечения пользовательских данных и репозиториев всякий раз, когда изменяется состояние имени пользователя. - Внутри эффекта мы определяем две асинхронные функции, fetchUserData и fetchRepositories, для получения соответствующих данных.
- В
fetchUserData
мы делаемAPI
вызовfetch user
данных, используяGitHub API endpoint
с предоставленным именем пользователя. - В
fetchRepositories
мы делаем вызов API для получения репозиториев, используяGitHub API
endpoint сprovided username
. - Если указано имя пользователя, мы вызываем оба
functions
для получения данных. - Мы обновляем соответствующие переменные состояния (userData и репозитории) с помощью полученных данных.
- Если во время выборки API возникает ошибка, мы обновляем состояние ошибки и устанавливаем для состояния загрузки значение false.
Функциональность поиска:
- Мы определяем
handleSearch function
для обработки действия поиска при нажатии кнопки «Поиск». - Он очищает любые
existing error
, пользовательские данные и репозитории из состояния. - Если указано имя пользователя, оно устанавливает состояние имени пользователя с введенным значением.
- Если имя пользователя не указано, оно устанавливает сообщение об ошибке в состоянии ошибки.
Рендеринг JSX:
- Мы возвращаем элементы JSX для рендеринга.
- Основной контейнер имеет имя класса «контейнер».
- Мы отображаем заголовок «
GitHub Profile
» и поле ввода поиска вместе с кнопкой «Поиск». - Поле ввода управляется состоянием имени пользователя, и его значение обновляется, когда пользователь вводит.
- При нажатии кнопки вызывается
handleSearch function
.
Если выполняется выборка API (isLoading имеет значение true), отображается сообщение о загрузке. - Если во время выборки API возникает ошибка (ошибка не нулевая), мы отображаем сообщение об ошибке.
- Внутри контейнера profile-repo-section мы условно отображаем карточку профиля и список репозиториев.
- Если
userData exists
, мы отображаем карточку профиля, содержащую логин пользователя, аватар, подписчиков иrepositories count
. - Если
repositories
содержит данные, мы отображаем раздел с заголовком «Repositories
» и списком именrepositories
.
Экспорт компонента:
- Мы экспортируем компонент
GitHubProfile
как экспорт по умолчанию.
Это подробное объяснение кода. Он извлекает пользовательские данные и репозитории из API GitHub на основе введенного имени пользователя и отображает информацию в карточке профиля и списке репозиториев.
А ТЕПЕРЬ САМЫЙ ОЖИДАННЫЙ РЕЗУЛЬТАТ ВСЕХ УСИЛИЙ:
— — — — — — — — — — — — — На этом все — — — — — — — — — — — — — —
Если вам понравилось читать этот блог, поделитесь им с друзьями и не забудьте подписаться на наш канал YouTube, чтобы получать больше интересного контента. Помогите нам рассказать о нашем опыте в разработке стека MERN, облачных вычислениях, React Native и Next.js, и следите за новостями, чтобы не пропустить новые информативные статьи. Вместе мы можем покорить мир технологий!
В разделе Проекты Mern Stack вы можете найти учебные пособия, советы, шпаргалки и другие проекты. Наши доклады также касаются фреймворков React, таких как NextJs и AWS Cloud. Присоединяйтесь к нам сегодня, чтобы быть в курсе новейших технологий🩷
📠 🏅:- Проекты Mern Stack
🎦 🥇:- Дневник Джары — YouTube 🚦
🎦 🥈 :- Эррормания — YouTube 🚦
На GITHUB:- raj-28 (Raj) (github.com)
💌 Подпишитесь на нашу рассылку, чтобы быть в курсе всех новых блогов 👍
…………🚦…🛣… ……………🚧🛑………………..▶……………….️
Используйте смайлики отсюда, если вам нужны….🚦🛣️🥇🥈🥉🏅🎖️🎦👍