React學習———useContext和useReducer

useContext

useContext是React的一個Hook,用于在函數組件中訪問上下文(context)的值。它可以幫助我們在組件樹中共享狀態,而不需要通過props一層層傳遞

特點

  • 用于跨組件共享狀態
  • 需要配合React.createContextContext.Provider使用
  • 簡化了組件間的狀態傳遞

基本用法

  • 創建 Context
import React, { createContext, useContext } from 'react';
const MyContext = createContext('默認值');
  • 提供 Context值
const App = () => {return (// 這個value可以傳遞任何類型的數據,包括字符串、數組、對象、函數等<MyContext.Provider value="共享值"><Child /></MyContext.Provider>)
}
  • 消費 Context值
const Child = () => {const value = useContext(MyContext)return <div>{value}</div>
}

注意事項

  • useContext只能在函數組件或自定義Hook中使用,不能在類組件中使用
  • 如果Context.Provider的value發生變化,所有使用該Context的組件都會重新渲染
  • 如果沒有Provider包裹,useContext會返回createContext時定義的默認值
  • 性能優化:如果value傳遞的是一個對象或數組,避免在每次渲染時創建新的引用(例如直接傳遞字面量對象或數組時),可以使用useMemo緩存value
    const value = useMemo(() => ({name: 'John',age:30}), [])
  • 嵌套Context:如果需要傳遞多個值,可以將他們組合成一個對象,或者使用多個Context.

使用場景

  • 主題切換:在應用中實現亮色和暗色主題的切換
  • 用戶認證:共享當前用戶的認證狀態,例如是否已登錄
  • 多語言支持:根據用戶的語言偏好動態切換界面語言
  • 全局狀態管理:在小型應用中替代Redux等狀態管理工具,簡化狀態共享

useReducer

useReducer是React的一個的Hook。用于在函數組件中進行更復雜的狀態管理。它適合于狀態邏輯較復雜、涉及多個子值或下一個狀態依賴于之前狀態的場景。用法類似于Redux的reducer

基本用法

import { useReducer } from 'react'
function reducer(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(reducer, {count: 0})return (<>Count: {state.count}// 通過dispatch 觸發action 的函數<button onClick={() => dispatch({ type: 'increment' })}>+</button><button onClick={() => dispatch({ type: 'decrement' })}>-</button></>)
}

1、render函數根據action.type來決定如何更新狀態
2、dispatch函數用于觸發狀態更新,每次點擊按鈕時,都會調用dispatch并傳遞相應的action對象

使用場景

  • 復雜的狀態邏輯:當狀態更新邏輯較為復雜,或者需要根據前一個狀態來計算新狀態時,useReducer可以更好地組織代碼
  • 多個子值:當狀態是一個包含多個子值的對象時,useReducer可以更方便管理這些子值
  • 性能優化:在某些情況下,useReducer可以比useState更高效,因為它允許將狀態更新邏輯集中在一個地方,減少不必要的重復渲染

useContext和useReducer結合使用實現全局狀態管理(類似于Redux)

  • useReducer管理全局狀態
  • useContext提供和消費這個狀態
import React, { createContext, useReducer, useContext } from 'react'
const CountContext = createContext(null)
function reducer(state, action){switch(action.type){case 'add':return { count: state.count + 1 }default:return state}
}function  ConterProvider({ children }){const [state, dispatch] = useReducer(reducer, {count: 0})return (<CountContext.Provider value={{state, dispatch}}>{ children  }</CountContext.Provider>)
}function Counter(){const { state, dispatch } = useContext(CountContext)return (<button onClick={() => dispatch({ type: 'add' })}>Count: {state.count}</button>)
}// 使用
function App() {return (<CounterProvider><Counter /></CounterProvider>)
}

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

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

相關文章

安卓刷機模式詳解:Fastboot、Fastbootd、9008與MTK深刷

安卓刷機模式詳解&#xff1a;Fastboot、Fastbootd、9008與MTK深刷 一、刷機模式對比 1. Fastboot模式 簡介&#xff1a;傳統安卓底層刷機模式&#xff0c;通過USB連接電腦操作優點&#xff1a;支持大多數安卓設備&#xff0c;操作相對簡單缺點&#xff1a;需要設備進入特定…

HDFS的概述

HDFS組成構架&#xff1a; 注&#xff1a; NameNode&#xff08;nn&#xff09;&#xff1a;就是 Master&#xff0c;它是一個主管、管理者。 (1) 管理 HDFS 的名稱空間&#xff1b; (2) 配置副本策略。記錄某些文件應該保持幾個副本&#xff1b; (3) 管理數據塊&#xff0…

配置Spark環境

1.上傳spark安裝包到某一臺機器&#xff08;自己在finaShell上的機器&#xff09;。 2.解壓。 把第一步上傳的安裝包解壓到/opt/module下&#xff08;也可以自己決定解壓到哪里&#xff09;。對應的命令是&#xff1a;tar -zxvf 安裝包 -C /opt/module 3.重命名。進入/opt/mo…

Java筆記五

1 Math類 1.1 概述 tips&#xff1a;了解內容 查看API文檔&#xff0c;我們可以看到API文檔中關于Math類的定義如下&#xff1a; Math類所在包為java.lang包&#xff0c;因此在使用的時候不需要進行導包。并且Math類被final修飾了&#xff0c;因此該類是不能被繼承的。 Math…

QT 插槽實現

方法 1&#xff1a;使用 default property 實現標簽插入 通過定義 default property&#xff0c;可以使組件直接嵌套在目標組件中&#xff0c;類似于插槽機制。 CustomSlotExample.qml import QtQuick 2.15 import QtQuick.Controls 2.15// 定義一個支持插槽的自定義組件 Re…

spark在shell中運行RDD程序

在hdfs中/wcinput中創建一個文件&#xff1a;word2.txt在里面寫幾個單詞 啟動hdfs集群 [roothadoop100 ~]# myhadoop start [roothadoop100 ~]# cd /opt/module/spark-yarn/bin [roothadoop100 ~]# ./spark-shell 寫個11測試一下 按住ctrlD退出 進入環境&#xff1a;spark-shel…

Redis 主從復制的實現原理是什么?

Redis主從復制的實現原理可通過以下核心機制與流程解析&#xff1a; 一、核心目標與角色分工 Redis主從復制通過**單一主節點&#xff08;Master&#xff09;**處理寫操作&#xff0c;**多個從節點&#xff08;Slave&#xff09;**同步數據并提供讀服務&#xff0c;實現&…

量化交易 - 網格交易策略實現與原理解析

&#x1f4c8; 網格交易策略實現與原理解析 &#x1f9e0; 什么是網格交易策略&#xff1f; 網格交易&#xff08;Grid Trading&#xff09;是一種經典的量化交易策略&#xff0c;其核心思想是在價格的不同區間&#xff08;“網格”&#xff09;中設置買入和賣出操作&#xf…

前端npm的核心作用與使用詳解

一、npm是什么? npm(Node Package Manager) 是 Node.js 的默認包管理工具,也是全球最大的開源代碼庫生態系統。雖然它最初是為 Node.js 后端服務設計的,但如今在前端開發中已成為不可或缺的基礎設施。通過npm,開發者可以輕松安裝、管理和共享代碼模塊。 特性: 依賴管理…

Vue3學習(組合式API——生命周期函數基礎)

目錄 一、Vue3組合式API中的生命周期函數。 &#xff08;1&#xff09;各階段生命周期涉及函數簡單介紹。 <1>創建掛載階段的生命周期函數。 <2>更新階段的生命周期函數。 <3>卸載階段的生命周期函數。 <4>錯誤處理的生命周期函數。 &#xff08;2&…

道通EVO MAX系列無人機-支持二次開發

道通EVO MAX系列無人機-支持二次開發 EVO Max 系列采用Autel Autonomy自主飛行技術&#xff0c;實現復雜環境下的全局路徑規劃、3D場景重建、自主繞障和返航&#xff1b;高精度視覺導航能力&#xff0c;使其在信號干擾強、信號遮擋、信號弱等復雜環境下&#xff0c;依然獲得高精…

網張實驗操作-防火墻+NAT

實驗目的 了解防火墻&#xff08;ENSP中的USG5500&#xff09;域間轉發策略配置、NAT&#xff08;與路由器NAT配置命令不同&#xff09;配置。 網絡拓撲 兩個防火墻連接分別連接一個內網&#xff0c;中間通過路由器連接。配置NAT之后&#xff0c;內網PC可以ping公網&#xf…

FPGA: UltraScale+ bitslip實現(方案+代碼)

收獲 一晃五年~ 五年前那個夏夜&#xff0c;我對著泛藍的屏幕敲下《給十年后的自己》&#xff0c;在2020年的疫情迷霧中編織著對未來的想象。此刻回望&#xff0c;第四屆集創賽的參賽編號仍清晰如昨&#xff0c;而那個在家熬夜焊電路板的"不眠者"&#xff0c;現在…

機器學習筆記2

5 TfidfVectorizer TF-IDF文本特征詞的重要程度特征提取 (1) 算法 詞頻(Term Frequency, TF), 表示一個詞在當前篇文章中的重要性 逆文檔頻率(Inverse Document Frequency, IDF), 反映了詞在整個文檔集合中的稀有程度 (2) API sklearn.feature_extraction.text.TfidfVector…

UV 快速入門和使用案例

UV 快速入門和使用案例 作者&#xff1a;王珂 郵箱&#xff1a;49186456qq.com 文章目錄 UV 快速入門和使用案例簡介一、安裝1.1 安裝包安裝1.2 從 PyPI 安裝二、使用2.1 創建項目2.2 包管理2.3 工具2.4 Python 版本 簡介 官網&#xff1a; 項目&#xff1a; https://githu…

質控腳本來嘍

好久不更新&#xff0c;上個硬貨。腳本需提前準備宿主和rrna的bowtie2索引文件&#xff0c;原始數據的命名方式為{sample}_raw_1/2.fq.gz&#xff0c;保存有原始數據路徑的文件&#xff0c;保存樣品列表的文件。 最后打個廣告&#xff0c;歡迎畜牧學方向的研究生報考蘭州大學。…

Linux Bash | Capture Output / Recall

注&#xff1a;本文為 “Linux Bash | Capture Output / Recall” 相關文章合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 Automatically Capture Output of the Last Command Into a Variable Using Bash 使用 Bash自動將最后一個命令的輸出捕獲到…

編程題 03-樹2 List Leaves【PAT】

文章目錄 題目輸入格式輸出格式輸入樣例輸出樣例 題解解題思路完整代碼 編程練習題目集目錄 題目 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. 輸入格式 Each input file contains one test case. For each case, …

QT設置MySQL驅動

QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7 第一步&#xff1a;下載MySQL https://dev.mysql.com/downloads/mysql/ 解壓縮下載的安裝包&#xff0c;其目錄結構如下所示&#xff1a; 第二…

ABP User Interface-Angular UI中文詳解

本系列文章主要用于對ABP User Interface-Angular UI &#xff08;Angular UI | ABP.IO Documentation&#xff09;不分的中文講解以及記錄自己在學習過程中發現的容易出錯的地方。 1. 開發Development 2. 核心功能Core Functions 3. 通用組件Utilities 4. 自定義Customiza…