React Hooks 深度解析

Hooks簡介

誕生背景
在React 16.8之前的版本中,組件主要分為函數組件和類組件兩大類。函數組件簡單輕量,但不支持狀態(state)和生命周期方法;而類組件雖然功能強大,但編寫和維護起來相對復雜。Hooks的引入旨在解決這一痛點,讓函數組件也能擁有狀態和其他React特性。

目的
Hooks的主要目的是在不增加復雜性的前提下,增強函數組件的能力。它們提供了一種將組件的邏輯封裝成可重用代碼塊的方式,使得代碼更加清晰和簡潔。

優勢

????????復用邏輯:通過自定義Hooks,可以輕松復用組件間的邏輯。

????????簡潔的組件樹:Hooks使得組件更加輕量級,有助于構建更簡潔的組件樹。

????????易于理解和維護:Hooks的語法更加直觀,使得代碼更易于閱讀和維護。

常用Hooks解析
1.?useState

? ? ?useState是React中最常用的Hook之一,它允許你在函數組件中添加狀態。

import React, { useState } from 'react';  function Counter() {  const [count, setCount] = useState(0);  return (  <div>  <p>You clicked {count} times</p>  <button onClick={() => setCount(count + 1)}>  Click me  </button>  </div>  );  
}
2.?useEffect

????useEffect讓你能夠在函數組件中執行副作用操作(如數據獲取、訂閱或手動更改React組件中的DOM)。

import React, { useEffect, useState } from 'react';  function FetchData() {  const [data, setData] = useState(null);  useEffect(() => {  fetch('https://api.example.com/data')  .then(response => response.json())  .then(data => setData(data));  }, []); // 空數組表示這個effect只在組件掛載時運行  if (data === null) {  return <div>Loading...</div>;  }  return <div>{JSON.stringify(data)}</div>;  
}
3.?useContext

?????useContext允許你在組件樹中共享數據,而無需手動將props一層層傳遞下去。

import React, { createContext, useContext, useState } from 'react';  const ThemeContext = createContext(null);  function ThemeProvider({ children }) {  const [theme, setTheme] = useState('light');  return (  <ThemeContext.Provider value={{ theme, setTheme }}>  {children}  </ThemeContext.Provider>  );  
}  function ThemedButton() {  const { theme, setTheme } = useContext(ThemeContext);  return (  <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>  The button is {theme}  </button>  );  
}
4.?useReducer

????????當組件中的狀態邏輯變得復雜時,使用useReducer可以使得狀態管理更加清晰。

import React, { useReducer } from 'react';  function counterReducer(state, action) {  switch (action.type) {  case 'increment':  return { count: state.count + 1 };  case 'decrement':  return { count: state.count - 1 };  default:  throw new Error();  }  
}  function Counter() {  const [state, dispatch] = useReducer(counterReducer, { count: 0 });  return (  <>  <p>{state.count}</p>  <button onClick={() => dispatch({ type: 'increment' })}>  Increment  </button>  <button onClick={() => dispatch({ type: 'decrement' })}>  Decrement  </button>  </>  );  
}
自定義Hooks

????????自定義Hooks的創建非常直接,它本質上就是一個函數,它的名字以use開頭,并且可以在這個函數內部調用其他的Hooks。通過自定義Hooks,你可以將組件邏輯抽象成可復用的函數,從而提高代碼的可維護性和復用性。

示例:

import React, { useState, useEffect } from 'react';  // 自定義Hooks:useFetch  
function useFetch(url) {  const [data, setData] = useState(null);  const [error, setError] = useState(null);  const [isLoading, setIsLoading] = useState(false);  useEffect(() => {  const fetchData = async () => {  setIsLoading(true);  try {  const response = await fetch(url);  if (!response.ok) {  throw new Error('Network response was not ok');  }  const json = await response.json();  setData(json);  } catch (error) {  setError(error);  }  setIsLoading(false);  };  fetchData();  }, [url]); // 依賴項數組中包含url,表示當url變化時重新執行effect  return { data, error, isLoading };  
}  // 使用自定義Hooks的組件  
function UserProfile({ userId }) {  const { data: userData, error, isLoading } = useFetch(`https://api.example.com/users/${userId}`);  if (error) {  return <div>Error: {error.message}</div>;  }  if (isLoading) {  return <div>Loading...</div>;  }  return (  <div>  <h1>{userData.name}</h1>  <p>{userData.email}</p>  </div>  );  
}

????????在這個例子中,useFetch是一個自定義Hooks,它接收一個URL作為參數,并返回一個對象,該對象包含加載的數據(data)、錯誤信息(error)和加載狀態(isLoading)。UserProfile組件使用這個自定義Hooks來異步加載用戶數據,并根據加載狀態和數據內容渲染不同的UI。

????????自定義Hooks的優勢在于它們能夠封裝復雜的邏輯,使得組件更加簡潔和易于理解。同時,由于Hooks的復用性,你可以在不同的組件中重復使用相同的邏輯,而不必每次都重寫相同的代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40497.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40497.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40497.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

驅動開發系列-如何與硬件通信

目錄 一:概述 二:I/O端口和I/O內存的概念 三:硬件寄存器(I/O寄存器)和內存 四:使用I/O端口 一:概述 驅動程序是軟件與硬件之間的抽象層;因此,它需要與這兩者對話,本文將向你展示驅動程序如何與硬件對話。并介紹I/O端口和I/O內存的概念。 二:I/O端口和I/O…

C++新特性

C新特性主要體現在語法改進和標準庫擴充兩個方面。以下是一些主要的C新特性&#xff1a; 語法改進 統一的初始化方法&#xff1a;C11擴大了用大括號括起的列表&#xff08;初始化列表&#xff09;的使用范圍&#xff0c;使其可用于所有的內置類型和用戶自定義的類型。這種定義…

【C語言】指針(1)--入門理解

目錄 一、內存和地址 二、指針變量和地址 三、指針變量類型的意義 一、內存和地址 只要講指針就離不開內存 因為指針就是訪問內存的 計算上CPU&#xff08;中央處理器&#xff09;在處理數據的時候&#xff0c;需要的數據是在內存中讀取的&#xff0c;處理后的數 據也會放…

PY32F030高性能單片機,主頻高達48M,最大64 KB 閃存,8 KB SRAM

PY32F030是普冉的一顆32位高性能MCU&#xff0c;采用32 位 ARM Cortex-M0 內核&#xff0c;高達16~64 Kbytes Flash 和 2~8 Kbytes SRAM 存儲器&#xff0c;最高 48 MHz 工作頻率。PY32F030 單片機的工作溫度范圍為 -40 ~ 105 C&#xff0c;工作電壓范圍為1.7 ~ 5.5 V&#xff…

Centos7刪除MariaDB

在 CentOS 7 上刪除 MariaDB 可以通過 yum 包管理器來完成。以下是一步一步的指導&#xff1a; 打開終端&#xff1a;首先&#xff0c;你需要打開你的 CentOS 7 系統的終端。 停止 MariaDB 服務&#xff08;如果正在運行&#xff09;&#xff1a;在卸載 MariaDB 之前&#xff…

IDEA實現遠程Debug的步驟與方法

IDEA實現遠程Debug的步驟與方法 在軟件開發過程中&#xff0c;遠程Debug是一個非常重要的功能&#xff0c;它允許開發者在本地IDE中調試遠程服務器上的應用程序。IntelliJ IDEA作為一款強大的Java開發工具&#xff0c;提供了豐富的遠程Debug功能。本文將詳細介紹如何使用IDEA實…

多語言版在線出租車預訂完整源碼+用戶應用程序+管理員 Laravel 面板+ 司機應用程序最新版源碼

源碼帶PHP后臺客戶端源碼 Flutter 是 Google 開發的一款開源移動應用開發 SDK。它用于開發 Android 和 iOS 應用&#xff0c;也是為 Google Fuchsia 創建應用的主要方法。Flutter 小部件整合了所有關鍵的平臺差異&#xff0c;例如滾動、導航、圖標和字體&#xff0c;可在 iOS 和…

DevOps實戰:使用GitLab+Jenkins+Kubernetes(k8s)建立CI_CD解決方案

一.系統環境 本文主要基于Kubernetes1.21.9和Linux操作系統CentOS7.4。 服務器版本docker軟件版本Kubernetes(k8s)集群版本CPU架構CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64CI/CD解決方案架構圖:CI/CD解決方案架構圖描述:程序員寫好代碼之…

ASP.NET MVC-razor編寫-2-svg中使用js+添加事件監聽

環境&#xff1a;win10 效果 初始狀態&#xff1a; 鼠標移入某個text&#xff08;比如KS primer&#xff09;時&#xff0c;text和連接的線條與箭頭都變色&#xff1a; 鼠標移出時回復正常。 如果是移入另一種紅色的text&#xff08;比如Cell Sceening Tag&#xff09;&…

創建本地倉庫

一、新建掛載目錄 二、將掛載本地鏡像掛載到目錄 三、配置yum倉庫 一、新建掛載目錄 mkdir /BenDiCangKu 二、將掛載本地鏡像掛載到目錄 1、先連接本地光盤 2、掛載光盤 mount /dev/sr0 /BenDiCangKu 3、查看掛載 由此可見掛載成功 三、配置yum倉庫 1、新建yum倉庫文件…

php簡單商城小程序系統源碼

&#x1f6cd;?【簡單商城小程序】&#x1f6cd;? &#x1f680;一鍵開啟&#xff0c;商城搭建新體驗&#x1f680; 你還在為繁瑣的商城搭建流程頭疼嗎&#xff1f;現在&#xff0c;有了簡單商城系統小程序&#xff0c;一切變得輕松又快捷&#xff01;無需復雜的編程知識&a…

構建Android studio版的CarSystemUI工程時因為包名一致導致BuildConfig問題

項目場景&#xff1a; 公司計劃開發杰發AC8025-Android 12版本車載平臺&#xff0c;前期預研需要構建Android studio版的CarSystemUI工程 問題描述 AAOS車載項目里面的CarSystemUI源碼默認無Android studio版本&#xff0c;為了后期快速開發調試需要構建Android studio能直接…

STM32基礎知識

一.STM32概述 第一款STM32單片機發布的時間為2007年6月11日。由意法半導體&#xff08;ST&#xff09;公司推出&#xff0c;是STM32系列中的首款產品&#xff0c;具體型號為STM32F1&#xff0c;它是一款基于Cortex-M內核的32位微控制器&#xff08;MCU&#xff09;。 STM32F1…

【openstack基礎操作】

openstack 常用命令 source ~/base/src/kayobe-config/etc/kolla/admin-openrc.sh https://docs.openstack.org//kayobe/latest/doc-kayobe.pdf 鏡像下載點 http://cloud.centos.org/centos/7/images/創建虛擬機 openstack server create --image 13d0686a-a7cc-4cc6-8bf7-76…

2024年【湖北省安全員-C證】考試資料及湖北省安全員-C證考試試卷

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 湖北省安全員-C證考試資料是安全生產模擬考試一點通生成的&#xff0c;湖北省安全員-C證證模擬考試題庫是根據湖北省安全員-C證最新版教材匯編出湖北省安全員-C證仿真模擬考試。2024年【湖北省安全員-C證】考試資料及…

JS+CSS+HTML項目-中國國家圖書館

頁面做的不多&#xff0c;CSS效果請看嗶哩嗶哩

英智玲瓏一體機在律所能做什么

只要不開庭&#xff0c;學習就不能停 好的律師是法律知識的百科全書 要精通、全面理解各類型的法律 還要不斷學習更新的條例釋義 一天即使工作24小時 也有忙不完的文書起草&#xff0c;資料核對&#xff0c;案情分析整理 有了英智玲瓏一體機&#xff0c;這些都不是難題&am…

MySQL8.0~open_files_limit 和 innodb_open_files 參數生效取值標準

前置條件 設置參數 /etc/security/limits.conf中設置如下 * soft nofile 100001 * hard nofile 100002 root soft nofile 100001 root hard nofile 100002 mysql soft nofile 65535 mysql hard nofile 65535my.cnf中設置如下 table_open_cache5000 open_files_limit20000 i…

一鍵式創建GTest測試平臺

適用于C GTest測試平臺搭建。直接上python腳本。 #!/usr/bin/env python3 # -*- coding: utf-8 -*-import argparse import os import platform import subprocess from xml.etree import ElementTree as ETdefault_root_path "d:\\test\\UTtest"class DeveloperTe…

init,service和systemctl的區別

1、service是一個腳本命令&#xff0c;分析service可知是去/etc/init.d目錄下執行相關程序。service和chkconfig結合使用。 服務配置文件存放目錄/etc/init.d/ 2、systemd centos7版本中使用了systemd&#xff0c;systemd同時兼容service,對應的命令就是systemctl systemctl命…