從 Prop Drilling 到 Context:React 狀態管理的演進與抉擇

Context的出現解決了什么問題?

Vue中的provide/inject和React中的Context非常相似,具體區別如下:

在這里插入圖片描述

可以看到實際上最大的區別在于Vue是響應式,React是非響應式

那么context具體解決了什么問題?我們先看下面這個例子:

function ComponentA() {const count = 10;return <ComponentB count={count} />
}function ComponentB({ count }) {return <ComponentC count={count} />
}function ComponentC({ count }) {return <ComponentD count={count} />
}function ComponentD({ count }) {return <ComponentE count={count} />
}function ComponentE({ count }) {return <div>{count}</div>
}

這種層層傳遞的形式就是典型的prop drilling (prop下鉆),會產生什么問題?

1.性能損耗(props改變會導致所有傳遞組件重新渲染)

2.難以維護(這個就不用多說了吧,可讀性很差)

3.心智負擔(react經典問題)

**那使用Context足夠完美嗎?**當然是不夠,Context依舊有性能損耗問題,Context中任意的屬性變化會引起所有使用該Context的組件發生re-render(重新渲染),及無法只訂閱局部變量,如何解決:
1.拆分Context,保證每個組件有屬于自己的獨立依賴空間且各組件間互不影響。

2.使用memo或者useMemo包裹組件(常見的react優化)。

為什么有Context還需要狀態管理庫,區別是什么?

根據上文我們可以知道context在優化是可以滿足全局狀態管理的需求的,那為什么還是要使用zustand這種狀態管理庫呢?

Context 可以實現全局狀態管理,但優化(如避免重復渲染)會增加代碼復雜度和心智負擔,且功能性有限。Zustand 提供選擇性訂閱、異步支持等特性,易用性更強。

Context 依賴組件樹,耦合度高,而 Zustand 獨立于組件樹,靈活性更高。Context 優勢在于輕量、無依賴,適合簡單場景。

狀態管理庫與設計模式

redux的核心是發布訂閱模式,而zustand等大部分狀態管理庫的核心是觀察者模式。

如何理解觀察者模式?vue的響應式核心就是使用的觀察者模式,一個觀察者和多個被觀察者直接通信,耦合度較高;發布訂閱模式其實就是觀察者模式的升級,多了一個用于派發的中間件(事件總線),發布者和訂閱者不直接通信,耦合度較低;

redux和zustand有什么區別

redux的核心是發布訂閱模式,zustand核心是觀察者模式,從設計模式角度,redux比zustand多了事件總線用來派發任務,在任務量大的情況下由于發布訂閱模式的中間件及事件派發會像虛擬dom一樣造成一定的性能損耗,所以性能不如觀察者模式,延遲也相對較高。

所以zustand就像一個功能性更強的全局useState更加輕量易用適合中小型項目,而redux更適合像企業級電商那種需要大量且復雜狀態管理的情況。

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

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

相關文章

考研408-數據結構完整代碼 線性表的順序存儲結構 - 順序表

線性表的順序存儲結構 - 順序表 1. 順序表的定義 ? 用一組地址連續的存儲單元依次存儲線性表的數據元素&#xff0c;從而使邏輯上相鄰的兩個元素在物理位置上也相鄰 2. 順序表的特點 隨機訪問&#xff1a; 即通過首地址和元素序號可以在O(1) 時間內找到指定元素&#xff0…

【經驗分享】SpringBoot集成WebSocket開發02 之 實現一個基本示例并Spring Bean注入的方式來組織代碼

結合Spring Boot和WebSocket實現一個基本示例&#xff0c;并且使用Spring Bean注入的方式來組織代碼。 1. 創建Spring Boot項目 首先&#xff0c;確保你有一個Spring Boot項目&#xff0c;并在pom.xml文件中引入了WebSocket相關的依賴。 <dependencies><!-- Spring…

DeepSeek-R1大模型微調技術深度解析:架構、方法與應用全解析

1. DeepSeek-R1大模型架構設計與技術特性 1.1 架構設計 DeepSeek-R1作為超大規模語言模型,其核心架構設計包含以下創新: 專家混合架構(MoE) 采用6710億參數的混合專家架構(MoE),每個推理過程僅激活370億參數,實現計算效率與資源利用率的突破性提升。 Transformer框架…

本地部署Hive集群

規劃 服務機器Hive本體部署在Node1元數據服務所需的關系型數據庫(MYSQL)部署在Node1 安裝MYSQL數據庫 # 更新密鑰 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安裝Mysql yum庫 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…

緩存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好&#xff0c;我是 方圓。本文將結合 Guava Cache 的源碼來分析它的實現原理&#xff0c;并闡述它相比于 Caffeine Cache 在性能上的劣勢。為了讓大家對 Guava Cache 理解起來更容易&#xff0c;我們還是在開篇介紹它的原理&#xff1a; Guava Cache 通過分段&#xff08;…

2025年【廣東省安全員C證第四批(專職安全生產管理人員)】考試及廣東省安全員C證第四批(專職安全生產管理人員)模擬試題

安全生產是各行各業不可忽視的重要環節&#xff0c;特別是在廣東省這樣的經濟大省&#xff0c;安全生產的重要性更是不言而喻。為了確保安全生產管理人員具備足夠的專業知識和實際操作能力&#xff0c;廣東省定期舉辦安全員C證考試。本文將詳細介紹2025年廣東省安全員C證第四批…

傳輸層自學

傳輸實體&#xff1a;完成傳輸層任務的硬件或軟件 可能位于&#xff1a; 操作系統內核獨立的用戶進程綁定在網絡應用中的鏈接庫網絡接口卡 1.功能&#xff1a; 網絡層與傳輸層作用范圍比較&#xff1f; 網絡層負責把數據從源機送達到目的機 傳輸層負責把數據送達到具體的應…

【C語言】函數和數組實踐與應用:開發簡單的掃雷游戲

【C語言】函數和數組實踐與應用&#xff1a;開發簡單的掃雷游戲 1.掃雷游戲分析和設計1.1掃雷游戲的功能說明&#xff08;游戲規則&#xff09;1.2游戲的分析與設計1.2.1游戲的分析1.2.2 文件結構設計 2. 代碼實現2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戲運行效果4…

Spring Cloud Config - 動態配置管理與高可用治理

引言&#xff1a;為什么需要配置中心&#xff1f; 在微服務架構中&#xff0c;配置管理面臨分散化、多環境、動態更新三大挑戰。傳統基于application.yml等配置文件的硬編碼方式&#xff0c;導致以下問題&#xff1a; ? 環境差異&#xff1a;開發、測試、生產環境配置混雜&a…

Git 常用命令指南

本文檔旨在提供 Git 的常用命令及其使用示例&#xff0c;涵蓋全局參數配置、獲取本地倉庫、基本概念、本地倉庫操作、遠程倉庫操作和分支操作等內容。 1. 全局參數配置 Git 允許用戶配置全局參數&#xff0c;以便在所有的倉庫中共享這些設置。 <BASH> # 設置用戶名 gi…

基于Python+Flask+MySQL+HTML的爬取豆瓣電影top-250數據并進行可視化的數據可視化平臺

FlaskMySQLHTML 項目采用前后端分離技術&#xff0c;包含完整的前端&#xff0c;以flask作為后端 Pyecharts、jieba進行前端圖表展示 通過MySQL收集格列數據 通過Pyecharts制作數據圖表 這是博主b站發布的詳細講解&#xff0c;感興趣的可以去觀看&#xff1a;【Python爬蟲可…

rpc grpc

RPC Remote Procedure Call&#xff0c;遠程過程調用&#xff0c;是用來屏蔽分布式計算中的各種調用細節&#xff0c;使得調用遠端的方法就像調用本地的一樣。 客戶端與服務端溝通的過程 客戶端發送數據(以字節流的方式)&#xff1b;&#xff08;編碼&#xff09;服務端接受…

GStreamer —— 2.15、Windows下Qt加載GStreamer庫后運行 - “播放教程 1:Playbin 使用“(附:完整源碼)

運行效果 介紹 我們已經使用了這個元素&#xff0c;它能夠構建一個完整的播放管道&#xff0c;而無需做太多工作。 本教程介紹如何進一步自定義&#xff0c;以防其默認值不適合我們的特定需求。將學習&#xff1a; ? 如何確定文件包含多少個流&#xff0c;以及如何切換 其中。…

30、Vuex 為啥可以進行緩存處理

Vuex 狀態管理基礎與緩存的關聯 Vuex 的核心概念&#xff1a; Vuex 主要由五個部分組成&#xff1a;state、mutations、actions、getters和modules。其中&#xff0c;state是存儲數據的地方&#xff0c;類似于一個全局的數據倉庫。在這個菜譜 APP 的例子中&#xff0c;緩存的數…

25屆數字IC驗證秋招總結

一、個人概況 雙非本9碩&#xff0c;2024年初開始通過白皮書藍皮書自學驗證&#xff0c;半年實習經驗&#xff0c;有競賽無專利論文&#xff0c;在秋招期間投遞企業130余家&#xff0c;絕大部分投遞崗位為數字驗證&#xff0c;面試20家&#xff0c;收到5個offer。因為背景和相關…

【商城實戰(37)】Spring Boot配置優化:解鎖高效商城開發密碼

【商城實戰】專欄重磅來襲&#xff01;這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建&#xff0c;運用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用戶、商品、訂單等核心模塊開發&#xff0c;再到性能優化、安全加固、多端適配&#xf…

網頁制作12-html,css,javascript初認識のJavascipt腳本基礎

一、JavaScript的三種基本使用方法:body|head|外部 網頁效果: 運行代碼: .html <!doctype html> <html> <head> <meta charset="utf-8"> <title>無標題文檔</title><script> function n1(){document.getElementById(…

全面對比分析:HDMI、DP、DVI、VGA、Type-C、SDI視頻接口特點詳解

在當今的多媒體時代&#xff0c;視頻接口的選擇對于設備連接和顯示效果至關重要。不同的視頻接口在傳輸質量、兼容性、帶寬等方面各有優劣。本文將全面對比分析常用的視頻接口HDMI、DP、DVI、VGA、Type-C、SDI&#xff0c;幫助讀者更好地理解它們的特點和適用場景。 一、HDMI&…

麒麟服務器操作系統PostgreSQL環境部署手冊

軟件簡介 PostgreSQL 是一個免費的對象-關系數據庫服務器(ORDBMS),在靈活的BSD許可證下發行。 ORDBMS(對象關系數據庫系統)是面向對象技術與傳統的關系數據庫相結合的產物,查詢處理是 ORDBMS 的重要組成部分,它的性能優劣將直接影響到DBMS 的性能。 軟件環境 操作系統…

【藍橋杯速成】| 4.遞歸

遞歸 題目一&#xff1a;最大公約數 問題描述 1979. 找出數組的最大公約數 - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 nums &#xff0c;返回數組中最大數和最小數的 最大公約數 。 兩個數的 最大公約數 是能夠被兩個數整除的最大正整數。 解題步驟 需要…