React強大且靈活hooks庫——ahooks入門實踐之高級類hook(advanced)詳解

什么是 ahooks?

ahooks 是一個 React Hooks 庫,提供了大量實用的自定義 hooks,幫助開發者更高效地構建 React 應用。其中高級類 hooks 是 ahooks 的一個重要分類,專門用于處理一些高級場景,如受控值、事件發射器、性能優化等。

安裝 ahooks

npm install ahooks

高級類 hooks 詳解

useControllableValue – 受控值

useControllableValue?用于處理受控和非受控組件的值管理。

import React, { useState } from "react";
import { useControllableValue } from "ahooks";
import { Card, Input, Button, Switch } from "antd";const UseControllableValueExample = () => {const [controlled, setControlled] = useState(false);const [value, setValue] = useControllableValue({value: controlled ? "受控值" : undefined,defaultValue: "默認值",onChange: (val) => {console.log("值變化:", val);},});return (<Card title="useControllableValue 受控值"><div style={{ marginBottom: 16 }}><p><strong>當前值:</strong> {value}</p><p><strong>模式:</strong> {controlled ? "受控" : "非受控"}</p></div><div style={{ marginBottom: 16 }}><Inputvalue={value}onChange={(e) => setValue(e.target.value)}placeholder="輸入內容"style={{ marginBottom: 8 }}/><Switchchecked={controlled}onChange={setControlled}checkedChildren="受控"unCheckedChildren="非受控"/></div><Button onClick={() => setValue("重置值")}>重置</Button></Card>);
};

useCreation – 創建值

useCreation?用于創建值,類似于?useMemo,但更穩定。

import React, { useState } from "react";
import { useCreation } from "ahooks";
import { Card, Button } from "antd";const UseCreationExample = () => {const [count, setCount] = useState(0);// 使用 useCreation 創建穩定的對象const stableObject = useCreation(() => {return {id: Math.random(),timestamp: Date.now(),};}, []);// 使用 useCreation 創建計算值const expensiveValue = useCreation(() => {console.log("計算昂貴值");return count * 2 + 10;}, [count]);return (<Card title="useCreation 創建值"><div style={{ marginBottom: 16 }}><p><strong>計數:</strong> {count}</p><p><strong>計算值:</strong> {expensiveValue}</p><p><strong>穩定對象 ID:</strong> {stableObject.id}</p><p><strong>穩定對象時間戳:</strong> {stableObject.timestamp}</p></div><Button onClick={() => setCount(count + 1)}>增加計數</Button></Card>);
};

useEventEmitter – 事件發射器

useEventEmitter?用于創建事件發射器,實現組件間通信。

import React, { useRef } from "react";
import { useEventEmitter } from "ahooks";
import { Card, Button, Input } from "antd";const UseEventEmitterExample = () => {const eventEmitter = useEventEmitter();const handleEmit = () => {eventEmitter.emit();};return (<Card title="useEventEmitter 事件發射器"><div style={{ marginBottom: 16 }}><p>點擊按鈕發射事件,輸入框會自動獲得焦點</p></div><Button onClick={handleEmit} style={{ marginBottom: 16 }}>發射事件</Button><InputBox eventEmitter={eventEmitter} /></Card>);
};// 輸入框組件
const InputBox = ({ eventEmitter }) => {const inputRef = useRef(null);eventEmitter.useSubscription(() => {inputRef.current?.focus();});return (<Inputref={inputRef}placeholder="輸入框會自動獲得焦點"style={{ width: "100%" }}/>);
};export default UseEventEmitterExample;

useIsomorphicLayoutEffect – 同構布局副作用

useIsomorphicLayoutEffect?在服務端渲染時使用?useEffect,在客戶端使用?useLayoutEffect

import React, { useState, useRef } from "react";
import { useIsomorphicLayoutEffect } from "ahooks";
import { Card, Button } from "antd";const UseIsomorphicLayoutEffectExample = () => {const [count, setCount] = useState(0);const ref = useRef(null);useIsomorphicLayoutEffect(() => {if (ref.current) {// 在布局更新前同步執行ref.current.style.backgroundColor =count % 2 === 0 ? "#f0f0f0" : "#e6f7ff";}}, [count]);return (<Card title="useIsomorphicLayoutEffect 同構布局副作用"><div style={{ marginBottom: 16 }}><p><strong>計數:</strong> {count}</p></div><divref={ref}style={{padding: 16,border: "1px solid #d9d9d9",borderRadius: 4,transition: "background-color 0.3s",}}>這個div的背景色會在布局更新前同步改變</div><Button onClick={() => setCount(count + 1)} style={{ marginTop: 16 }}>切換背景色</Button></Card>);
};

useLatest – 最新值

useLatest?返回一個 ref,始終指向最新的值。

import React, { useState, useEffect } from "react";
import { useLatest } from "ahooks";
import { Card, Button } from "antd";const UseLatestExample = () => {const [count, setCount] = useState(0);const latestCount = useLatest(count);useEffect(() => {const timer = setInterval(() => {console.log("當前值:", count);console.log("最新值:", latestCount.current);}, 1000);return () => clearInterval(timer);}, []);return (<Card title="useLatest 最新值"><div style={{ marginBottom: 16 }}><p><strong>當前值:</strong> {count}</p><p><strong>最新值引用:</strong> {latestCount.current}</p><p style={{ fontSize: "12px", color: "#666" }}>每秒在控制臺輸出當前值和最新值引用</p></div><Button onClick={() => setCount(count + 1)}>增加計數</Button></Card>);
};

useMemoizedFn – 記憶化函數

useMemoizedFn?用于創建記憶化的函數,避免不必要的重新渲染。

import React, { useState } from "react";
import { useMemoizedFn } from "ahooks";
import { Card, Button } from "antd";const UseMemoizedFnExample = () => {const [count, setCount] = useState(0);const [renderCount, setRenderCount] = useState(0);// 使用 useMemoizedFn 創建穩定的函數const handleClick = useMemoizedFn(() => {setCount(count + 1);console.log("點擊處理函數執行");});// 每次渲染都會創建新函數const handleClickNormal = () => {setCount(count + 1);console.log("普通函數執行");};// 強制重新渲染const forceRender = () => {setRenderCount(renderCount + 1);};return (<Card title="useMemoizedFn 記憶化函數"><div style={{ marginBottom: 16 }}><p><strong>計數:</strong> {count}</p><p><strong>渲染次數:</strong> {renderCount}</p></div><div style={{ marginBottom: 16 }}><Button onClick={handleClick} style={{ marginRight: 8 }}>記憶化函數</Button><Button onClick={handleClickNormal} style={{ marginRight: 8 }}>普通函數</Button><Button onClick={forceRender}>強制重新渲染</Button></div><p style={{ fontSize: "12px", color: "#666" }}>記憶化函數在重新渲染時保持穩定,普通函數每次都會重新創建</p></Card>);
};

useReactive – 響應式狀態

useReactive?用于創建響應式狀態對象。

import React from "react";
import { useReactive } from "ahooks";
import { Card, Button, Input } from "antd";const UseReactiveExample = () => {const state = useReactive({user: {name: "張三",age: 25,},count: 0,list: [1, 2, 3],});const handleUpdateName = () => {state.user.name = "李四";};const handleUpdateAge = () => {state.user.age += 1;};const handleAddCount = () => {state.count += 1;};const handleAddToList = () => {state.list.push(state.list.length + 1);};return (<Card title="useReactive 響應式狀態"><div style={{ marginBottom: 16 }}><p><strong>用戶名:</strong> {state.user.name}</p><p><strong>年齡:</strong> {state.user.age}</p><p><strong>計數:</strong> {state.count}</p><p><strong>列表:</strong> {state.list.join(", ")}</p></div><div style={{ marginBottom: 16 }}><Inputvalue={state.user.name}onChange={(e) => (state.user.name = e.target.value)}placeholder="輸入用戶名"style={{ marginBottom: 8 }}/></div><div><Button onClick={handleUpdateName} style={{ marginRight: 8 }}>更新姓名</Button><Button onClick={handleUpdateAge} style={{ marginRight: 8 }}>增加年齡</Button><Button onClick={handleAddCount} style={{ marginRight: 8 }}>增加計數</Button><Button onClick={handleAddToList}>添加列表項</Button></div></Card>);
};

高級類 hooks 速查表

Hook 名稱用途描述
useControllableValue受控值處理受控和非受控組件的值管理
useCreation創建值創建穩定的值,類似于 useMemo
useEventEmitter事件發射器創建事件發射器,實現組件間通信
useIsomorphicLayoutEffect同構布局副作用在服務端和客戶端使用不同的副作用
useLatest最新值返回一個始終指向最新值的 ref
useMemoizedFn記憶化函數創建記憶化的函數,避免不必要的重新渲染
useReactive響應式狀態創建響應式狀態對象

?React強大且靈活hooks庫——ahooks入門實踐之高級類hook(advanced)詳解 - 高質量源碼分享平臺-免費下載各類網站源碼與模板及前沿動態資訊

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

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

相關文章

計算機網絡——數據鏈路層(25王道最新版)

數據鏈路層前言數據鏈路層的功能封裝成幀&#xff08;組幀&#xff09;字符計數法字節填充法零比特填充法違規編碼法小節差錯控制檢錯編碼奇偶校驗碼CRC校驗碼&#xff08;循環冗余校驗碼&#xff09;基本思想如何構造如何檢錯糾錯糾錯編碼海明校驗碼設計思路求解步驟&#xff…

【PTA數據結構 | C語言版】字符串替換算法

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將給定主串 s 中的子串 sub_s 替換成另一個給定字符串 t&#xff0c;再輸出替換后的主串 s。 輸入格式&#xff1a; 輸入給出 3 個非空字符串&#xff0c;依次為&#xff1a…

事物生效,訂單類內部更新訂單

代碼如下以下代碼1不生效&#xff0c;2生效解決方案1&#xff0c;外層方法加注解&#xff0c;內層不加2&#xff0c;不要拆分方法&#xff0c;把更新訂單操作放在帶事物的大方法中3&#xff0c;拆方法&#xff08;內部&#xff09;&#xff0c;注入自己&#xff0c;用代理對象調…

非對稱加密:RSA

文章目錄 非對稱加密:RSA 1、RSA 加解密 2、RSA 生成密鑰對(公鑰、私鑰)、加解密 參考資料 非對稱加密:RSA 1、RSA 加解密 <!-- RSA --><!-- 引入jsencrypt庫 --><script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.3.2/jsencrypt.min.js&q…

MongoDB 數據庫 啟用訪問控制

0. 最近服務器安裝了 MongoDB 被勒索了 測試服務器安裝了 MongoDB 等&#xff0c;開放了 27017 對所有 ip。 哈哈哈哈哈哈&#xff0c;問就是有點犯懶&#xff0c;之前都是只允許自己的 ip。 好家伙&#xff0c;然后沒過幾個小時&#xff0c;數據庫集合被清空&#xff0c;只留…

【Unity Sprite屬性拓展】

Unity Inspector 精靈圖預覽為 Unity 中的 Sprite 類型屬性提供了??增強版的 Inspector 顯示??&#xff0c;在保留標準精靈選擇功能的基礎上&#xff0c;添加了大型預覽圖和精靈名稱顯示功能代碼 using UnityEngine; using UnityEditor;// 1?? 告訴 Unity&#xff1a;所有…

細菌實驗入門:濃度測定與菌種鑒定技術詳解

在微生物實驗中&#xff0c;細菌濃度的精準測定和菌種的準確鑒定是兩項基礎且核心的操作。本文將詳細介紹相關技術的原理、操作步驟及注意事項&#xff0c;為新手提供系統性指導。一、細菌濃度測定方法1. 光密度法&#xff08;OD600&#xff09;&#xff1a;快速定量的首選原理…

GaussDB 數據庫架構師修煉(一)數據庫容量規劃

1、容量規劃的定義GaussDB容量規劃是指根據客戶業務系統的負載需求或歷史運行數據&#xff0c;進行合理規劃GaussDB的計算、存儲和網絡資源配置&#xff0c;以滿足業務系統正常使用和未來若干年負載增長訴求的過程。2、容量規劃活動主要步驟需求收集調研生產系統的業務特征&…

hashMap原理(一)

概念HashMap是java中一種非常常用的基于哈希表的數據結構&#xff0c;允許o(1)的時間復雜度進行元素插入&#xff0c;查找&#xff0c;和刪除。它通過”鍵-值“ 對的方式存儲數據。總的來說&#xff1a;HashMap的底層原理&#xff1a;數組鏈表紅黑樹&#xff08;jdk1.8之后還涉…

Ubuntu24 輔助系統-屏幕鍵盤的back按鍵在網頁文本框刪除不正常的問題解決方法

Ubuntu24 輔助系統-屏幕鍵盤的back按鍵異常 問題描述ubuntu24這個屏幕鍵盤&#xff0c;只有在網頁的搜索框或者文本框&#xff0c;比如百度首頁的搜索框&#xff0c;留言的文本框&#xff0c;才會出現點擊back按鈕的時候&#xff0c;出現了先選中當前這個字符&#xff0c;刪除此…

自然語言指令驅動的工業機器人協同學習系統:大語言模型如何重塑智能體協作范式

重磅推薦專欄: 《大模型AIGC》 《課程大綱》 《知識星球》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域,包括但不限于ChatGPT和Stable Diffusion等。我們將深入研究大型模型的開發和應用,以及與之相關的人工智能生成內容(AIGC)技術。通過深入的技術解析和實踐經…

web:js的switch語句

在js中,switch語句是一種用于根據不同的條件執行不同代碼塊的控制流語句。它類似于多個if...else if...else語句,但結構更清晰,特別是在有多個條件分支的情況下。 基本語法 switch (expression) {case value1:// 當expression的值等于value1時執行這里的代碼break;case va…

為何說分布式 AI 推理已成為下一代計算方式

2024 年&#xff0c;我們見證了人工智能創新的空前爆發。AI 的快速發展令很多人驚嘆&#xff0c;為了訓練更先進的大語言模型&#xff08;LLM&#xff09;&#xff0c;科技巨頭爭相獲取強大的 GPU。如今&#xff0c;AI 正在無縫融入我們世界的每個角落。在眾多新興 AI 公司、模…

阿里云 RabbitMQ 可觀測性最佳實踐

阿里云 RabbitMQ 阿里云 RabbitMQ 是一款高性能、高可靠的消息中間件&#xff0c;支持多種消息協議和豐富的功能特性。它提供消息隊列功能&#xff0c;能夠實現應用間的消息解耦和異步通信&#xff0c;提升系統擴展性和穩定性。其支持多種消息持久化策略&#xff0c;確保消息不…

vue-router 導航式編程 參數的設置

主要是想記錄一下this.$router.push、replace、go等方法的參數如何設置。字符串路徑router.push(/home)直接使用字符串&#xff08;或模板字符串&#xff09;路徑&#xff0c;可跳轉到相應的URL路徑。對象式路徑路徑也可以是一個對象&#xff0c;對象里以key:value的形式表示UR…

Swift實現股票圖:從基礎到高級

目錄一、核心實現方案1. 原生方案&#xff1a;使用 Core Graphics 繪制2. 使用第三方庫&#xff1a;Charts3. 跨平臺方案&#xff1a;使用 SwiftUI Canvas二、技術指標實現1. 移動平均線 (MA)2. 布林帶 (Bollinger Bands)3. MACD (Moving Average Convergence Divergence)三、…

【unitrix】 6.4 數特征(number.rs)

一、源碼 這段代碼定義了一個名為Number的trait&#xff08;特質&#xff09;以及它的實現。 use crate::sealed::Sealed; use crate::number::{V, BaseNumber, TNumber};/// 數值的統一標記特質 /// 可以是編譯時類型化數字(TNumber)或運行時變量(V<T>) pub trait Numbe…

AI治AI:大語言模型自檢新法

“以火攻火”的思路解決大語言模型(LLMs)“幻覺”問題 虛構是由于與提示無關的內部因素而不可預測地從 LLM 中出現的幻覺。作者專注于衡量 LLM 對提示響應的不確定性,使用高不確定性表示虛構的假設。他們通過計算一個稱為熵的量來估計這種不確定性**,熵可以被認為是模型生…

ESLint 配置錯誤:ReferenceError: prettier is not defined 解決方案

問題描述在使用 pnpm lint 運行 ESLint 時&#xff0c;出現以下錯誤&#xff1a;Oops! Something went wrong! :( ESLint: 9.31.0 ReferenceError: prettier is not defined該錯誤導致 ESLint 無法正確執行代碼格式檢查&#xff0c;但 不會影響項目的實際運行&#xff08;如 pn…

數據結構--準備知識

一.算法效率算法效率分為兩種&#xff1a;第一種為時間效率&#xff0c;第二種為空間效率。時間效率稱為時間復雜度&#xff0c;空間效率稱為空間復雜度。時間復雜主要衡量一個算法的運行速度&#xff0c;空間復雜度主要衡量一個算法所需的 額外的空間&#xff08;現在不需要特…