【React】基于自定義Hook提取公共邏輯

目錄

  • 自定義Hook
    • 自定義Hook 1
    • 自定義Hook 2
    • 使用
  • 注意事項

在這里插入圖片描述

自定義Hook

作用:提取封裝一些公共的處理邏輯
玩法:創建一個函數,名字需要是 useXxx ,后期就可以在組件中調用這個方法!

自定義Hook 1

頁面加載的時候修改瀏覽器標簽的名字。

const useDidMount = function useDidMount(title) {if (!title) title = 'React';// 基于React內置的Hook函數,實現需求即可useEffect(() => {document.title = title;}, []);
};

自定義Hook 2

由于useState 返回的 set修改狀態方法只能“修改單一的數據”,可能會對其他數據造成影響,所以我們這里自定義一個Hook,在修改單一數據的同時,不對其他數據造成影響。

useA 是一個自定義 Hook,它的功能是管理一個對象類型的狀態,并提供一個更新該狀態的函數 setA。參數:

  • val:這是 useA 接受的初始值,通常是一個對象,代表狀態的初始值。

  • useState(val):它初始化狀態 a,并返回一個數組,數組的第一個元素是當前的狀態,第二個元素是更新該狀態的函數(seta)。

  • setA(partialState):這個函數用來更新狀態。它 接收一個部分狀態(partialState),然后將其與當前狀態合并 。這里使用了 ES6 的 … 擴展運算符,將當前狀態 a 和部分更新的狀態合并起來,確保只更新其中的某些字段,而不影響其他字段。

  • 返回值:返回一個數組:第一個元素是當前的狀態 a,第二個元素是更新該狀態的函數 setA。

const useA = function (val) {const [a, seta] = useState(val);const setA = function setA(partialState) {seta({...a,...partialState})}return [a, setA]
}

使用

const Demo = function Demo() {let [state, setA] = useA({supNum: 10,oppNum: 5});const handle = (type) => {if (type === 'sup') {setA({supNum: state.supNum + 1});return;}setA({oppNum: state.oppNum + 1});};useDidMount('哈哈哈哈哈');return <div className="vote-box"><div className="main"><p>支持人數:{state.supNum}</p><p>反對人數:{state.oppNum}</p></div><div className="footer"><Button type="primary" onClick={handle.bind(null, 'sup')}>支持</Button><Button type="primary" danger onClick={handle.bind(null, 'opp')}>反對</Button></div></div>;
};

注意事項

下面寫法就會報錯,因為命名使用use開頭,React會進行檢驗Hook函數的規則。

const Demo = function Demo() {if(1==1){useDidMount('哈哈哈哈哈');}
}

如果不使用use開頭,就不會報錯,但是我們一般封裝自定義Hook,要遵守Hook函數的規則

const Demo = function Demo() {AAA ('哈哈哈哈哈');}

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

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

相關文章

AUTOSAR與arxml的文檔解析

如下是文檔腦圖 一、文檔概述 該文檔是 AUTOSAR 經典平臺的應用接口用戶指南&#xff0c;主要解釋 **Al Table&#xff08;應用接口表&#xff09;** 的結構、方法論及相關技術細節&#xff0c;幫助開發者理解如何通過標準化接口實現軟件組件的互操作性。 關鍵內容 目的&#…

油候插件、idea、VsCode插件推薦(自用)

開發軟件&#xff1a; 之前的文章&#xff1a; 開發必裝最實用工具軟件與網站 推薦一下我使用的開發工具 目前在用的 油候插件 AC-baidu-重定向優化百度搜狗谷歌必應搜索_favicon_雙列 讓查詢變成多列&#xff0c;而且可以流式翻頁 Github 增強 - 高速下載 github下載 TimerHo…

阿里云平臺服務器操作以及發布靜態項目

目錄&#xff1a; 1、云服務器介紹2、云服務器界面3、發布靜態項目1、啟動nginx2、ngixn訪問3、外網訪問測試4、拷貝靜態資源到nginx目錄下并重啟nginx 1、云服務器介紹 2、云服務器界面 實例詳情&#xff1a;里面主要顯示云服務的內外網地址以及一些啟動/停止的操作。監控&…

Spring Cache 實戰指南

redis中常見的問題 前言 在本文中&#xff0c;我們將探討 Redis 在緩存中的應用&#xff0c;并解決一些常見的緩存問題。為了簡化理解&#xff0c;本文中的一些配置是直接寫死的&#xff0c;實際項目中建議將這些配置寫入配置文件&#xff0c;并通過配置文件讀取。 一、為什…

區塊鏈開發技術公司:引領數字經濟的創新力量

在數字化浪潮席卷全球的今天&#xff0c;區塊鏈技術作為新興技術的代表&#xff0c;正以其獨特的去中心化、不可篡改和透明性等特點&#xff0c;深刻改變著各行各業的發展格局。區塊鏈開發技術公司&#xff0c;作為這一領域的先鋒和推動者&#xff0c;正不斷研發創新&#xff0…

EJS緩存解決多頁面相同閃動問題

基于 EJS 的模板引擎特性及其緩存機制&#xff0c;以下是關于緩存相同模塊的詳細解答&#xff1a; 一、EJS 緩存機制的核心能力 模板編譯緩存 EJS 默認會將編譯后的模板函數緩存在內存中&#xff0c;當相同模板文件被多次渲染時&#xff0c;會直接復用已編譯的模板函數&#x…

多條件排序(C# and Lua)

C# 升序排序 OrderBy 按升序對序列的元素進行排序 ThenBy 按升序對序列中的元素執行后續排序 降序排序 OrderByDescending 按降序對序列的元素排序 ThenByDescending 按降序對序列中的元素執行后續排序 public class Fruit {public int id;public string name;publi…

React19源碼系列之Hooks(useId)

useId的介紹 https://zh-hans.react.dev/reference/react/useId useId 是 React 18 引入的一個新 Hook&#xff0c;主要用于生成全局唯一的 ID。在開發中&#xff0c;我們經常需要為元素&#xff08;如表單元素、模態框等&#xff09;生成唯一 ID&#xff0c;以便在 JavaScri…

經典面試題:C/C++中static關鍵字的三大核心作用與實戰應用

一、修飾局部變量&#xff1a;改變生命周期&#xff0c;保留跨調用狀態 核心作用&#xff1a; ?延長生命周期&#xff1a;將局部變量從棧區移至靜態存儲區&#xff08;數據段或BSS段&#xff09;&#xff0c;生命周期與程序一致?保留狀態&#xff1a;變量在函數多次調用間保…

Redisson 分布式鎖原理

加鎖原理 # 如果鎖不存在 if (redis.call(exists, KEYS[1]) 0) then# hash結構,鎖名稱為key,線程唯一標識為itemKey&#xff0c;itemValue為一個計數器。支持相同客戶端線程可重入,每次加鎖計數器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 設置過期時間redis.call(pexpi…

【數據結構】棧與隊列:基礎 + 競賽高頻算法實操(含代碼實現)

什么是棧&#xff1f;什么是隊列&#xff1f; 什么是先進后出&#xff1f;什么是先進先出&#xff1f; 了解基礎之后&#xff0c;又如何用來寫算法題&#xff1f; 帶著這些疑問&#xff0c;讓我帶領你&#xff0c;走進棧與隊列的世界 棧與隊列 棧&#xff1a; 1、棧的基本…

單元化架構在字節跳動的落地實踐

資料來源&#xff1a;火山引擎-開發者社區 什么是單元化 單元化的核心理念是將業務按照某種維度劃分成一個個單元&#xff0c; 理想情況下每個單元內部都是完成所有業務操作的自包含集合&#xff0c;能獨立處理業務流程&#xff0c;各個單元均有其中一部分數據&#xff0c;所有…

基于Python的垃圾短信分類

垃圾短信分類 1 垃圾短信分類問題介紹 1.1 垃圾短信 隨著移動互聯科技的高速發展&#xff0c;信息技術在不斷改變著我們的生活&#xff0c;讓我們的生活更方便&#xff0c;其中移動通信技術己經在我們生活起到至關重要的作用&#xff0c;與我們每個人人息息相關。短信作為移…

leetcode1971.尋找圖中是否存在路徑

初嘗并查集&#xff0c;直接套用模板 class Solution { private:vector<int> father;void init() {for(int i0;i<father.size();i)father[i]i;}int find(int v) {return vfather[v]?v:father[v]find(father[v]);//路徑壓縮}bool isSame(int u,int v){ufind(u);vfind…

QAI AppBuilder 快速上手(7):目標檢測應用實例

YOLOv8_det是YOLO 系列目標檢測模型&#xff0c;專為高效、準確地檢測圖像中的物體而設計。該模型通過引入新的功能和改進點&#xff0c;如因式分解卷積&#xff08;factorized convolutions&#xff09;和批量歸一化&#xff08;batch normalization&#xff09;&#xff0c;在…

景聯文科技:以高質量數據標注推動人工智能領域創新與發展

在當今這個由數據驅動的時代&#xff0c;高質量的數據標注對于推動機器學習、自然語言處理&#xff08;NLP&#xff09;、計算機視覺等領域的發展具有不可替代的重要性。數據標注過程涉及對原始數據進行加工&#xff0c;通過標注特定對象的特征來生成能夠被機器學習模型識別和使…

MySQL 索引下推

概念 索引下推&#xff08;Index Condition Pushdown&#xff0c;簡稱 ICP&#xff09; 是 MySQL 5.6 版本中提供的一項索引優化功能&#xff0c;它允許存儲引擎在索引遍歷過程中&#xff0c;執行部分 WHERE字句的判斷條件&#xff0c;直接過濾掉不滿足條件的記錄&#xff0c;…

NVIDIA Dynamo源碼編譯

Ref https://github.com/PyO3/maturin Rust 程序設計語言 代碼庫&#xff1a; https://github.com/ai-dynamo/dynamo https://github.com/ai-dynamo/nixl dynamo/container/Dockerfile.vllm 相關whl包 官方提供了4個whl包 ai_dynamo # 這個包ubuntu 22.04也可以用&…

【Android】安卓原生應用播放背景音樂與音效(筆記)

本文提供完整的音頻管理器代碼&#xff0c;涵蓋了背景音樂&#xff08;BGM&#xff09;和短音效的播放控制。無論是游戲中的音效&#xff0c;還是應用中的背景音樂&#xff0c;通過 AudioManager&#xff0c;你可以方便地管理和控制音頻資源。 前言 在 Android 開發中&#xf…

Unity | 游戲數據配置

目錄 一、ScriptableObject 1.創建ScriptableObject 2.創建asset資源 3.asset資源的讀取與保存 二、Excel轉JSON 1.Excel格式 2.導表工具 (1)處理A格式Excel (2)處理B格式Excel 三、解析Json文件 1.讀取test.json文件 四、相關插件 在游戲開發中,策劃…