React 個人筆記 Hooks編程

作用

配合函數式編程,保證在不產生類的時候完成一個整體的組件

常用組件

  1. useState
  2. useContext
  3. useReducer
  4. useEffect
  5. useMemo
  6. useCallback

前三個值為自變量
后三者為因變量

前三者相當于其他編程函數的變量聲明,而后三者相當于對變量進行了(if now != previous)的包裝,執行函數

useState

適用于:簡單邏輯狀態管理

//創建
const [state, setState] = useState(defaultState)//直接修改
setState(nextState);
// 函數修改,會接收到一個參數是原先 state 的值,該函數的返回值將作為更新后 state 的值
setState(preState => nextState);

useReducer

用于處理更復雜的狀態邏輯。相比于 useState,它更適合用于處理涉及多個子值的狀態,或者下一個狀態依賴于之前的狀態的情況

// 定義初始狀態
const initialState = { count: -1 };
//初始化函數
function init(initial) {// 確保初始計數值為正數return { count: Math.abs(initial.count) };
}
// 定義 reducer 函數
function counterReducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };case 'reset':return initialState;default:throw new Error();}
}
}// 在組件中使用
function Counter() {const [state, dispatch] = useReducer(counterReducer, initialState, init);//第三個參數可以傳入函數,這個函數允許你自定義初始化邏輯,而不是直接使用第二個參數 initialState作為初始狀態(對第二個參數進行預處理,如取abs)。當你需要對初始狀態進行一些計算或處理時return (<div><p>Count: {state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>+1</button><button onClick={() => dispatch({ type: 'decrement' })}>-1</button><button onClick={() => dispatch({ type: 'reset' })}>Reset</button></div>);
}

·

useContext

和props的區別

  1. Props 是父組件向子組件傳遞數據的一種方式,從上往下傳遞,
  2. useContext 是一個 React Hook,允許你訂閱 React 的 Context 對象。Context 提供了一種在組件之間共享數據的方式

作用
Props 主要用于父子組件之間的通信,而 useContext 解決了跨層級組件間的數據共享問題。如果組件層次較深,為了將某個 prop 從根組件傳遞到深層嵌套的組件,可能需要在每一層中間組件中“透傳”這個 prop(即使這些中間組件并不使用該 prop),這被稱為“prop drilling“ 使用useContext可以避免prop drilling
過度依賴 Context 可能導致不必要的重新渲染,因為它本質上是全局的。而 Props 則更細粒度,僅影響接收它們的組件

使用樣例, 文件名為 ThemeContext.js,創造好了context,引用該文件后可以 useContext

import React, { createContext, useState, useContext } from 'react';// 創建 ThemeContext
export const ThemeContext = createContext();// 創建一個提供者組件來包裹需要訪問 context 的組件樹
export const ThemeProvider = ({ children }) => {const [theme, setTheme] = useState('light'); // 默認主題為 lightconst toggleTheme = () => {setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');};return (<ThemeContext.Provider value={{ theme, toggleTheme }}>{children}</ThemeContext.Provider>);
};
import React, { useContext } from 'react';
import { ThemeProvider, ThemeContext } from './ThemeContext'; // 假設文件名為 ThemeContext.js
import MiddleComponent from './MiddleComponent';function App() {const { theme, toggleTheme } = useContext(ThemeContext);return (<ThemeProvider><div className={`app ${theme}`}><button onClick={toggleTheme}>Toggle Theme</button><MiddleComponent /></div></ThemeProvider>);
}export default App;
import React from 'react';
import DeeplyNestedComponent from './DeeplyNestedComponent';function MiddleComponent() {return (<div><h2>Middle Component</h2><DeeplyNestedComponent /></div>);
}export default MiddleComponent;
import React, { useContext } from 'react';
import { ThemeContext } from './ThemeContext'; // 假設文件名為 ThemeContext.jsfunction DeeplyNestedComponent() {const { theme } = useContext(ThemeContext);return (<div className={`deeply-nested-component ${theme}`}><h3>Deeply Nested Component with {theme} theme</h3></div>);
}export default DeeplyNestedComponent;

useEffect

useEffect Hook 讓你可以執行副作用操作(如數據獲取、訂閱或手動 DOM 操作),并根據指定的依賴項數組來決定何時重新執行副作用

  1. 無依賴項: 在組件每次渲染后執行。
  2. 空數組([]): 僅在組件掛載和卸載時執行
  3. 依賴項數組: 當數組中的任何值發生變化時,effect將會重新運行。
import React, { useState, useEffect } from 'react';function Example() {const [count, setCount] = useState(0);useEffect(() => {console.log(`You clicked ${count} times`);return () => {// 清理函數console.log('清理工作');};}, [count]); // 只有 count 改變時觸發(注意 初始化的時候也會加載一次return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

useMemo

useMemo Hook 用于記憶計算結果,避免重復計算。它接收一個創建函數和依賴項數組,只有當依賴項改變時才會重新計算返回值。

import React, { useState, useMemo } from 'react';function computeExpensiveValue(a, b) {console.log("Performing expensive computation...");return a + b;
}function Example({ a, b }) {const [count, setCount] = useState(0);const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);return (<><p>Memoized Value: {memoizedValue}</p><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increase Count</button></>);
}

useCallBack

seCallback Hook 與 useMemo 類似,用于記憶函數定義。優化性能,特別是當將回調函數作為 props 傳遞給子組件時,可以防止子組件重新渲染。

import React, { useState, useCallback } from 'react';function ChildComponent({ onButtonClick }) {console.log("ChildComponent render");return <button onClick={onButtonClick}>Click Me!</button>;//即使父組件渲染,ChildComponent 接收到的 onButtonClick 回調不會改變, Click me Button不會重新渲染
}function ParentComponent() {const [count, setCount] = useState(0);const handleClick = useCallback(() => {console.log("Button clicked");}, []); // 空數組意味著這個回調永遠不會更新return (<><ChildComponent onButtonClick={handleClick} /><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increase Count</button></>);
}

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

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

相關文章

logits是啥、傅里葉變換

什么是logtis&#xff1f; 在深度學習的上下文中&#xff0c;logits 就是一個向量&#xff0c;下一步通常被投給 softmax/sigmoid 的向量。。 softmax的輸出是分類任務的概率&#xff0c;其輸入是logits層。 logits層通常產生-infinity到 infinity的值&#xff0c;而softmax層…

Adobe Illustrator學習備忘

1.移動畫板&#xff1a;需按住空格鍵加鼠標一塊才能拖動 2.放大縮小畫板&#xff1a;按住Alt鍵加鼠標滾輪 3.撤回&#xff1a;CtrlZ 4.鋼筆練習網站&#xff1a;The Bzier Game

【初識】內網滲透——基礎概念,基本工具使用

目錄 一、域&#xff0c;工作組&#xff0c;域控制器&#xff0c;活動目錄相關概念&#xff1a; 域環境&#xff1a; 工作組&#xff1a; 域控制器DC&#xff1a; 活動目錄AD&#xff1a; 二、內網的基本場景&#xff1a; 三、內網滲透基本測試方案&#xff1a; #案例1一基本信…

remove_const的工作原理及c++的類型推導

author: hjjdebug date: 2025年 05月 21日 星期三 12:51:57 CST descrip: remove_const的工作原理及c的類型推導 文章目錄 1. 簡單的程序代碼.2.std::remove_const_t 到底是怎樣工作的&#xff1f;2.1 測試代碼2.2 類型推導的調試手段.2.2.1 給類模板添加成員函數,讓它打印信息…

人臉識別,使用 deepface + api + flask, 改寫 + 調試

1. 起因&#xff0c; 目的&#xff0c; 感受: github deepface 這個項目寫的很好&#xff0c; 繼續研究使用這個項目&#xff0c;改寫 api。增加一個前端 flask app 2. 先看效果 3. 過程: 大力改寫原始項目中 api 這部分的代碼&#xff0c; 原始項目的文件結構太繁雜了: 我把…

三維表面輪廓儀的維護保養是確保其長期穩定運行的關鍵

三維表面輪廓儀是一種高精度測量設備&#xff0c;用于非接觸式或接觸式測量物體表面的三維形貌、粗糙度、臺階高度、紋理特征等參數。其主要基于光學原理進行測量。它利用激光或其他光源投射到被測物體表面&#xff0c;通過接收反射光或散射光&#xff0c;結合計算機圖像處理技…

Lambda表達式的高級用法

今天來分享下Java的Lambda表達式&#xff0c;以及它的高級用法。 使用它可以提高代碼的簡潔度&#xff0c;使代碼更優雅。 一、什么是lambda表達式 Lambda 表達式是 Java 8 引入的特性&#xff0c;用于簡化匿名內部類的語法&#xff0c;使代碼更簡潔&#xff0c;尤其在處理函…

31-35【動手學深度學習】深度學習硬件

1. CPU和GPU 1.1 CPU CPU每秒鐘計算的浮點運算數為0.15&#xff0c;GPU為12。GPU的顯存很低&#xff0c;16GB&#xff08;可能32G封頂&#xff09;&#xff0c;CPU可以一直插內存。 左邊是GPU&#xff08;只能做些很簡單的游戲&#xff0c;視頻處理&#xff09;&#xff0c;中…

【MySQL成神之路】MySQL常見命令匯總

目錄 MySQL常用命令總結 1. 數據庫操作 2. 表操作 3. 數據操作&#xff08;DML&#xff09; 4. 索引與優化 5. 用戶與權限管理 6. 備份與恢復 7. 事務控制 8. 常用函數 9. 系統狀態與日志 總結 MySQL常用命令總結 MySQL作為最流行的關系型數據庫之一&#xff0c;提供…

Dify的大語言模型(LLM) AI 應用開發平臺-本地部署

前言 今天閑著&#xff0c;搗鼓一下 Dify 這個開源平臺&#xff0c;在 mac 系統上&#xff0c;本地部署并運行 Dify 平臺&#xff0c;下面記錄個人在本地部署Dify 的過程。 Dify是什么&#xff1f; Dify是一個開源的大語言模型&#xff08;LLM&#xff09;應用開發平臺&#…

【論文閱讀】針對BEV感知的攻擊

Understanding the Robustness of 3D Object Detection with Bird’s-Eye-View Representations in Autonomous Driving 這篇文章是發表在CVPR上的一篇文章&#xff0c;針對基于BEV的目標檢測算法進行了兩類可靠性分析&#xff0c;即惡劣自然條件以及敵對攻擊。同時也提出了一…

SonarQube的核心作用與用途

SonarQube作為一個開源的代碼質量管理平臺&#xff0c;致力于持續分析代碼的健康狀態&#xff0c;幫助開發團隊提升代碼質量。以下是其核心作用與用途的詳細說明&#xff1a; 1、靜態代碼分析 SonarQube通過靜態代碼分析技術&#xff0c;自動識別代碼中的潛在問題。它能夠檢測…

AI工程師系列——面向copilot編程

前言 ? 筆者已經使用copilot協助開發有一段時間了,但一直沒有總結一個協助代碼開發的案例,特別是怎么問copilot,按照什么順序問,哪些方面可以高效的生成需要的代碼,這一次,筆者以IP解析需求為例,沉淀一個實踐案例,供大家參考 當然,其實也不局限于copilot本身,類似…

【軟件設計師】知識點簡單整理

文章目錄 數據結構與算法排序算法圖關鍵路徑 軟件工程決策表耦合類型 編程思想設計模式 計算機網絡域名請求過程 數據結構與算法 排序算法 哪些排序算法是穩定的算法?哪些不是穩定的算法,請舉出例子。 穩定排序算法&#xff1a;冒泡排序、插入排序、歸并排序、基數排序、計數…

FastAPI 支持文件下載和上傳

文章目錄 1. 文件下載處理1.1. 服務端處理1.1.1. 下載小文件1.1.2. 下載大文件&#xff08;yield 支持預覽的&#xff09;1.1.3. 下載大文件&#xff08;bytes&#xff09;1.1.4. 提供靜態文件服務1.1.5. 中文文件名錯誤 1.2. 客戶端處理1.2.1. 普通下載1.2.2. 分塊下載1.2.3. …

naive-ui切換主題

1、在App.vue文件中使用 <script setup lang"ts"> import Dashboard from ./views/dashboard/index.vue import { NConfigProvider, NGlobalStyle, darkTheme } from naive-ui import { useThemeStore } from "./store/theme"; // 獲取存儲的主題類…

Kotlin 協程 (三)

協程通信是協程之間進行數據交換和同步的關鍵機制。Kotlin 協程提供了多種通信方式&#xff0c;使得協程能夠高效、安全地進行交互。以下是對協程通信的詳細講解&#xff0c;包括常見的通信原語、使用場景和示例代碼。 1.1 Channel 定義&#xff1a;Channel 是一個消息隊列&a…

使用SQLite Studio導出/導入SQL修復損壞的數據庫

使用SQLite Studio導出/導入SQL修復損壞的數據庫 使用Zotero時遇到了數據庫損壞&#xff0c;在軟件中寸步難行&#xff0c;遂嘗試修復數據庫。 一、SQLite Studio簡介 SQLite Studio是一款專為SQLite數據庫設計的免費開源工具&#xff0c;支持Windows/macOS/Linux。相較于其…

【git config --global alias | Git分支操作效率提升實踐指南】

git config --global alias | Git分支操作效率提升實踐指南 背景與痛點分析 在現代軟件開發團隊中&#xff0c;Git分支管理是日常工作的重要組成部分。特別是在規范的開發流程中&#xff0c;我們經常會遇到類似 feature/user-management、bugfix/login-issue 或 per/cny/dev …

(八)深度學習---計算機視覺基礎

分類問題回歸問題聚類問題各種復雜問題決策樹√線性回歸√K-means√神經網絡√邏輯回歸√嶺回歸密度聚類深度學習√集成學習√Lasso回歸譜聚類條件隨機場貝葉斯層次聚類隱馬爾可夫模型支持向量機高斯混合聚類LDA主題模型 一.圖像數字化表示及建模基礎 二.卷積神經網絡CNN基本原…