0303hooks-react-仿低代碼平臺項目

文章目錄

    • 1. 副作用
    • 2.其他內置hooks
      • 2.1 useEffect
      • 2.2 useRef
      • 2.3useMemo
      • 2.4 useCallback
    • 3.自定義hooks
    • 4. 第三方hooks
    • 5. hooks使用原則
    • 6. hooks閉包陷阱
    • 7. 總結
    • 結語

1. 副作用

  • 當組件渲染完成時,加載一個Ajax網絡請求
  • 當某個state更新時,加載一個Ajax網絡請求

示例:

const List2: FC = () => {console.log("加載Ajax網絡請求。。。");...	

控制臺如下圖所示:在這里插入圖片描述

分析:函數式組件,任何state更新,都會重新執行函數;組件初次渲染,也會執行函數。

解決這種情況,通過如下其他hooks完成。

2.其他內置hooks

2.1 useEffect

  • useEffect用法

解決“當組件渲染完成時,加載一個Ajax網絡請求”問題,如下所示:

  useEffect(() => {console.log("渲染完成");}, []);
// 格式
useEffect(setup, dependencies?)
useEffect(func, [])

組件渲染完成,執行一次。

  • 參數分析:

    • func:函數

    • []:依賴于…觸發,默認”空“當前組件。

  • useEffect執行只依賴于[]中指定的變量,可以是多個,任一一個變量更新,都觸發函數執行。示例如下

      useEffect(() => {console.log("渲染完成");}, []);useEffect(() => {console.log("questionList change");}, [questionList]);
    
    • 執行組件增、改、刪,打印questionList change在這里插入圖片描述
  • 組件銷毀時觸發useEffect,QuestionCard.tsx如下

      useEffect(() => {console.log("QuestionCard mounted");return () => {console.log("QuestionCard unmounted " + id);};}, []);
    
    • 控制臺打印如下所示:在這里插入圖片描述
  • useEffect監聽react組件的聲明周期:創建、更新、銷毀等。

  • useEffect組件執行創建-銷毀-在創建原因:從v18版本開始,在開發環境下會執行該過程;在生成環境中只執行一次。

    yarn build
    把打包好的文件放置在nginx配置的web路徑下
    
    • 如下圖所示:在這里插入圖片描述

2.2 useRef

在 React 開發中,開發者常常需要直接操作 DOM 元素或存儲臨時數據,但 React 的狀態管理機制(如 useState)有時無法滿足這些需求。這時,一個名為 useRef 的 Hook 就像一位靈活的“中間人”,在虛擬 DOM 與真實 DOM 之間架起了一座橋梁。本文將深入探討 useRef 的核心原理、使用場景及進階技巧,幫助開發者高效利用這一工具解決實際問題。

  • 什么是 useRef?

useRef 是 React 提供的一個 Hook,用于創建可變的引用(reference),其核心特性是:

  1. 不會觸發組件重渲染:修改 useRef 的值不會導致組件重新渲染;
  2. 直接訪問 DOM 元素:通過 ref 屬性綁定到 DOM 元素,獲取其真實引用;
  3. 存儲臨時數據:適合保存不需要觸發 UI 更新的臨時變量。

示例:

import { FC, useRef } from "react";const Demo: FC = () => {const inputRef = useRef<HTMLInputElement>(null);function selectInput() {const inputEle = inputRef.current;inputEle && inputEle.select();}return (<div><input ref={inputRef} defaultValue="hello world" /><button onClick={selectInput}> 點擊選中</button></div>);
};export default Demo;

在這里插入圖片描述

  • 一般用于操作DOM
  • 也可傳入普通JS變量,單更新不會觸發rerender

2.3useMemo

  • 函數組件,每次state更新都會重新執行函數
  • useMemo可以緩存數據,不用每次執行函數都重新生成
  • 可用于計算量較大的場景,緩存提高性能
import { FC, useState, useMemo } from "react";
const Demo: FC = () => {console.log("demo...");const [num1, setNum1] = useState(10);const [num2, setNum2] = useState(20);const [text, setText] = useState("hello");const sum = useMemo(() => {console.log("sum use memo ");return num1 + num2;}, [num1, num2]);return (<><p>{sum} </p><p>{num1}<buttononClick={() => {setNum1(num1 + 1);}}>add num1</button></p><p>{num2}<buttononClick={() => {setNum2(num2 + 1);}}>add num2</button></p><div><input onChange={(e) => setText(e.target.value)} value={text} /></div></>);
};export default Demo;

在這里插入圖片描述

2.4 useCallback

  • 和useMemo作用一樣,專門用于緩存函數

示例:

import { FC, useState, useCallback } from "react";const Demo: FC = () => {const [text, setText] = useState("hello");const fn1 = () => console.log("fn1 text ", text);const fn2 = useCallback(() => {console.log("fn2 text ", text);}, [text]);return (<><div><button onClick={fn1}>fn1</button><hr /><button onClick={fn2}>fn2</button></div><div><input onChange={(e) => setText(e.target.value)} value={text} /></div></>);
};export default Demo;

緩存,性能優化,提示時間效率。

3.自定義hooks

  • 內置hooks保證基礎的功能
  • 內置hooks靈活配合,實現業務功能
  • 抽離公共部分,自定義hooks或者第三方hooks-復用代碼

代碼演示1:修改網頁標題

UseTitle.ts

import { useEffect } from "react";function useTitle(title: string) {useEffect(() => {document.title = title;}, []);
}export default useTitle;

App.tsx

import useTitle from "./hooks/UseTitle";function App() {useTitle("自定義標題1");return (<></>);
}export default App;

在這里插入圖片描述

代碼演示2:獲取鼠標位置

useMouse.ts

import { useState, useEffect } from "react";// 獲取鼠標位置,自定義hooks
function useMouse() {const [x, setX] = useState(0);const [y, setY] = useState(0);// 鼠標事件處理const mouseEventHandler = (e: MouseEvent) => {setX(e.clientX);setY(e.clientY);};useEffect(() => {// 監聽鼠標事件window.addEventListener("mousemove", mouseEventHandler);//組件銷毀時,一定要解綁DOM事件(不解綁,可能出現內存泄露問題)return () => {// 解綁鼠標事件,與綁定時參數相同window.removeEventListener("mousemove", mouseEventHandler);};}, []);return { x, y };
}export default useMouse;

App.tsx

import useMouse from "./hooks/useMouse";function App() {const { x, y } = useMouse();return (<><p>鼠標位置:{x} {y}</p></>);
}export default App;

效果如下圖所示:在這里插入圖片描述

代碼演示3:模擬異步獲取數據

useGetInfo.ts

import { useState, useEffect } from "react";// 異步獲取信息
function getInfo(): Promise<string> {return new Promise((resolve) => {setTimeout(() => {resolve(new Date().toString());}, 1500);});
}const useGetInfo = () => {const [loading, setLoading] = useState(true);const [info, setInfo] = useState("");useEffect(() => {getInfo().then((info) => {setLoading(false);setInfo(info);});}, []);return { loading, info };
};export default useGetInfo;

App.tsx

import useGetInfo from "./hooks/useGetInfo";function App() {const { loading, info } = useGetInfo();return (<><div>{loading ? "加載中" : info}</div></>);
}export default App;

效果如下圖所示:在這里插入圖片描述

4. 第三方hooks

常用第三方hooks:文檔地址參考下面鏈接2和鏈接3

  • ahooks
  • react-use

以ahooks為例,演示:修改網頁標題

import { useTitle } from "ahooks";function App() {useTitle("自定義標題2");return (<></>);
}export default App;

演示:獲取鼠標位置

import { useMouse } from "ahooks";function App() {const { clientX, clientY } = useMouse();return (<><p>鼠標位置:{clientX} {clientY}</p></>);
}export default App;

5. hooks使用原則

  • 使用useXxx格式命名
  • 只能在兩個地方調用hook:組件內,其他hook內。
  • 必須保證每次的調用順序一致(不能放在if for內部)

6. hooks閉包陷阱

  • 當異步函數獲取state時,可能不是當前最新的state
  • 可以使用useRef解決

演示示例:

Cloususe.tsx

import { FC, useState, useRef, useEffect } from "react";const Demo: FC = () => {const [count, setCount] = useState(0);// 累加function add() {setCount(count + 1);}// 打印countfunction printCount() {setTimeout(() => {console.log(count);}, 2000);}return (<><p>閉包陷阱</p><div><p>{count}</p><button onClick={add}>累加</button><button onClick={printCount}>打印</button></div></>);
};export default Demo;

App.tsx

import ClosureTrap from "./ClosureTrap";function App() {return (<><ClosureTrap /></>);
}export default App;

效果如下圖所示:在這里插入圖片描述

解決方案:

Clousure.tsx

import { FC, useState, useRef, useEffect } from "react";const Demo: FC = () => {const [count, setCount] = useState(0);const countRef = useRef(0);useEffect(() => {countRef.current = count;}, [count]);// 累加function add() {setCount(count + 1);}// 打印countfunction printCount() {setTimeout(() => {console.log(countRef.current);}, 2000);}return (<><p>閉包陷阱</p><div><p>{count}</p><button onClick={add}>累加</button><button onClick={printCount}>打印</button></div></>);
};export default Demo;

效果如下圖所示:在這里插入圖片描述

7. 總結

目標:

  • 學會內置hooks
  • 學會自定義hooks
  • 學會使用第三方hooks

知識點:

  • 自定義hooks

    • useState

      • Immer:state的不可變數據
    • useEffect

    • useRef

    • useMemo

    • useCallback

  • 第三方hooks

    • ahooks

    • react-use

  • 閉包陷阱

注意事項:

  • hooks是React最重要的內容之一
  • 初學者很難通過概念理解hooks,必須配合大量實踐練習
  • hooks有很多規則,遇到錯誤時,先看是否違反規則

結語

?QQ:806797785

??倉庫地址:https://gitee.com/gaogzhen

??倉庫地址:https://github.com/gaogzhen

[1]useEffect[CP/OL].

[2]ahook官網[CP/OL].

[3]github react-use[CP/OL].

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

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

相關文章

Zephyr、FreeRTOS、RT-Thread 定時器區別分析

一、核心特性對比 特性ZephyrFreeRTOSRT-Thread定時器類型系統定時器&#xff08;k_timer&#xff09;、硬件定時器軟件定時器&#xff08;基于系統tick&#xff09;軟件定時器、硬件定時器定時模式單次、周期性單次、自動重載&#xff08;周期性&#xff09;單次、周期、自定…

手撕unique_ptr 和 shareed_ptr

文章目錄 unique_ptrshared_ptr unique_ptr template<class T> class Unique_ptr { private:T* ptrNULL; public://1、刪除默認的拷貝構造函數Unique_ptr(Unique_ptr& u) delete;//2、刪除默認的復制構造Unique_ptr& operator(Unique_ptr& u) delete; …

對比 HashMap 和 ConcurrentHashMap 擴容邏輯的差異

HashMap 和 ConcurrentHashMap 在 擴容邏輯 上有明顯的差異&#xff0c;尤其是在并發環境下的處理策略&#xff0c;這是它們核心區別之一。 &#x1f9f1; 一、總體對比表&#xff08;JDK 8 為例&#xff09; 特性HashMapConcurrentHashMap線程安全? 否? 是是否支持并發擴容…

Linux 的準備工作

1.root用戶登錄 首先講一下root賬戶怎么登陸 直接 ssh root 公ip地址就可以了 比如我的是騰訊云的 這個就是公ip 下面所有普通用戶的操作都是在root賬戶下進行的 2.普通用戶創建 創建用戶指令 adduser 用戶名 比如說這個指令 我創建了一個ly_centos的普通用戶 3.普通用…

自動變為 VIP 文章

今天突然發現自己寫的大部分文章都被自動設為了VIP文章。 我這才想起來以前好像填過一個什么表&#xff0c;說要允許CS-DN把自己寫的文章自動設為VIP文章。 我也忘了為啥要允許CSDN動我寫的文章了&#xff0c;把幾乎所有文章都給設為VIP顯然是不合適的&#xff0c;畢竟文章是給…

Vue3+Vite+TypeScript+Element Plus開發-08.登錄設計

系列文檔目錄 Vue3ViteTypeScript安裝 Element Plus安裝與配置 主頁設計與router配置 靜態菜單設計 Pinia引入 Header響應式菜單縮展 Mockjs引用與Axios封裝 登錄設計 登錄成功跳轉主頁 多用戶動態加載菜單 文章目錄 目錄 系列文檔目錄 文章目錄 前言 一、登錄mo…

全新二手羅德SMCV100B信號發生器SMBV100A

全新二手羅德SMCV100B信號發生器SMBV100A SMCV100B信號發生器SMBV100A主要特點 適用于廣播電視、導航、蜂窩和無線應用的多標準平臺 全軟件選件定義的矢量信號發生器&#xff0c;具備 5″ 觸摸屏 全新的射頻信號生成概念&#xff0c;頻率范圍介于 4 kHz 至 7.125 GHz 輸出功率…

spring mvc @ResponseBody 注解轉換為 JSON 的原理與實現詳解

ResponseBody 注解轉換為 JSON 的原理與實現詳解 1. 核心作用 ResponseBody 是 Spring MVC 的一個注解&#xff0c;用于將方法返回的對象直接序列化為 HTTP 響應體&#xff08;如 JSON 或 XML&#xff09;&#xff0c;而不是通過視圖解析器渲染為視圖&#xff08;如 HTML&…

OpenCV——圖像融合

OpenCV——圖像融合 一、引言1.1 圖像融合分類 二、C代碼實現三、效果展示3.1 標準球3.2 鋁制底座 一、引言 在許多計算機視覺應用中(例如機器人運動和醫學成像)&#xff0c;需要將來自多幅圖像的相關信息集成到一幅圖像中。這種圖像融合將提供更高的可靠性、準確性和數據質量…

機器學習之PCA主成分分析詳解

文章目錄 引言一、PCA的概念二、PCA的基本數學原理2.1 內積與投影2.2 基2.3 基變換2.4 關鍵問題及優化目標2.5 方差2.6 協方差2.7 協方差矩陣2.8 協方差矩陣對角化 三、PCA執行步驟總結四、PCA參數解釋五、代碼實現六、PCA的優缺點七、總結 引言 在機器學習領域&#xff0c;我…

springboot自動配置原理例子講解

Spring Boot 的自動配置是其核心特性之一&#xff0c;它幫助開發者**"開箱即用"**地使用各種第三方庫或 Spring 組件&#xff0c;而無需手動配置 Bean。這一切的背后&#xff0c;都依賴于 Spring Boot 的自動配置機制。 我們分兩部分來說&#xff1a; Spring Boot 自…

一款基于 .NET 8 + Vue 開源的、企業級中后臺權限管理系統

前言 今天大姚給大家分享一款基于 .NET 8 Vue 開源、前后端分離的企業級中后臺權限管理系統&#xff0c;助力快速完成常規業務需求開發&#xff1a;ApeVolo.Admin。 項目介紹 ApeVolo.Admin 一款基于.NET 8、SqlSugar、Vue、Elment UI、RBAC、前后端分離、開源&#xff08;…

vue3騰訊云直播 前端推流

1、在index.html文件中引入&#xff08;在body體中&#xff09; <script src"https://video.sdk.qcloudecdn.com/web/TXLivePusher-2.1.1.min.js" charset"utf-8"></script> 2、vue文件中&#xff0c;添加video推流&#xff08;我用的推流地…

藍疊模擬器過檢測全攻略

BlueStacks藍疊MagiskLsposed安裝和過應用檢測教程 藍疊MagiskLsposed安裝和過應用檢測教程 引言 藍疊模擬器憑借其出色的性能和兼容性&#xff0c;在電腦上運行安卓應用和游戲方面備受青睞。然而&#xff0c;眾多應用和游戲為確保公平性與安全性&#xff0c;加入了模擬器檢測…

Flutter Invalid constant value.

0x00 問題 參數傳入變量&#xff0c;報錯&#xff01; 代碼 const Padding(padding: EdgeInsets.all(20),child: GradientProgressIndicator(value: _progress), ),_progress 參數報錯&#xff1a;Invalid constant value. 0x01 原因 這種情況&#xff0c;多發生于&#xff…

搜廣推校招面經七十一

滴滴算法工程師面經 一、矩陣分解的原理與優化意義 矩陣分解在推薦系統中是一個非常核心的方法&#xff0c;尤其是在 協同過濾(Collaborative Filtering) 中。我們可以通過用戶對物品的評分行為來推測用戶的喜好&#xff0c;從而推薦他們可能喜歡的內容。 1.1. 直觀理解&…

實習技能記錄【2】-----LVGL[基本概念]

LVGL主要概念 1. Screen (屏幕): 概念: 屏幕是 LVGL 應用程序中的頂層容器。它是用戶界面的根對象&#xff0c;所有的可見 UI 元素最終都會添加到某個屏幕上&#xff08;通常是活動屏幕&#xff09;。 功能: 作為其他 UI 元素的父對象。 可以擁有自己的背景顏色、背景圖片等樣…

【c++11】c++11新特性(上)(列表初始化、右值引用和移動語義、類的新默認成員函數、lambda表達式)

&#x1f31f;&#x1f31f;作者主頁&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所屬專欄&#xff1a;C 目錄 前言 一、列表初始化 1. 大括號初始化 2. initializer_list 二、右值引用和移動語義 1. 左值和右值 2. 左值引用和右值引用 引用延長生命周期 左…

軟考中級-軟件設計師 2022年下半年上午題真題解析:通關秘籍+避坑指南

&#x1f4da; 目錄&#xff08;快速跳轉&#xff09; 選擇題&#xff08;上午題&#xff09;&#xff08;每題1分&#xff0c;共75分&#xff09;一、 計算機系統基礎知識 &#x1f5a5;?&#x1f4bb; 題目1&#xff1a;計算機硬件基礎知識 - RISC&#xff08;精簡指令集計算…

基于MCP協議調用的大模型agent開發02

目錄 在AI agent的開發過程中&#xff0c;如何使用mcp服務器作為大模型的工具調用‘百寶箱’&#xff1f; FastAPI FastMCP 本系列&#xff1a; 基于MCP協議調用的大模型agent開發01-CSDN博客 基于MCP協議調用的大模型agent開發02-CSDN博客 在AI agent的開發過程中&#xff0c;…