為何 React JSX 循環需要使用 key

key 是 React 用于識別列表中哪些子元素被改變、添加或刪除的唯一標識符
它幫助 React 更高效、更準確地更新和重新渲染列表

1、核心原因:Diff算法與性能優化

React 的核心思想之一是通過虛擬 DOM (Virtual DOM) 來減少對真實 DOM 的直接操作,從而提升性能。當組件的狀態或屬性發生變化時,React 會創建一個新的虛擬 DOM 樹,并將其與之前的虛擬 DOM 樹進行比較。這個過程叫做 “Diffing”(差異比對)

假設:在處理列表時候,沒有key(React的diffing 算法會變更很低效),默認索引為key作為標識,
原本有一個列表[‘A’,‘B’,‘C’,‘D’],現在需要再原來的基礎上在開頭新增一個元素 變為 [‘E’,‘A’,‘B’,‘C’,‘D’]

如沒有key:
在這里插入圖片描述
React 會比較第一個位置的 A 和 X,發現內容變了,于是更新第一個

  • 的文本。接著比較第二個位置的 B 和 A,又更新…以此類推。它會修改所有已有的子元素,而不是意識到 A, B, C, D 只是位置后移了,最終還會在末尾創建一個新的
  • 。這導致了大量不必要的真實 DOM 操作(更新),性能極差
  • 有key時:
    在這里插入圖片描述

    React 通過 key(例如 key={item.id})知道 A, B, C ,D 仍然是原來的項,只是移動了位置。它只會創建一個新的

  • (對應 X)并插入到開頭,然后移動原有的三個
  • 。這個過程(移動和插入)遠比更新每個節點的內容要高效。
  • 2、保持狀態的正確性(這是更重要的原因!)
    key 不僅僅是性能優化,它直接關系到組件實例狀態的正確性。

    React 使用 key 來匹配多次渲染間的組件實例。如果 key 保持不變,React 會認為這是同一個組件實例,因此它會保留該組件的狀態(如 useState、useRef 的值)。如果 key 改變了,React 會銷毀舊的組件實例并創建一個新的

    看一個經典的例子:一個待辦事項列表,每個事項有一個輸入框可以編輯。

    // 錯誤的做法:使用 index 作為 key
    const TodoList = () => {const [todos, setTodos] = useState(['Learn React', 'Build a project']);const addTodo = () => {const newTodo = prompt('New todo:');// 在列表開頭添加新項setTodos([newTodo, ...todos]);};return (<div><button onClick={addTodo}>Add Todo</button><ul>{todos.map((todo, index) => (// 🚨 危險!使用 index 作為 key<li key={index}>{todo}<input type="text" placeholder="Edit..." /></li>))}</ul></div>);
    };
    

    會發生什么?

    初始有兩個待辦項:Learn React 和 Build a project。它們的 key 分別是 0 和 1。

    你在 第二項 (key=1) 的輸入框里輸入了 “test”。

    你點擊 “Add Todo”,在開頭添加了一個新項 “New Item”。

    現在列表變成了:[‘New Item’, ‘Learn React’, ‘Build a project’]。

    React 開始 Diffing:

    舊 key=0 (‘Learn React’) vs 新 key=0 (‘New Item’) -> 內容變了,更新文本,但輸入框實例被復用。

    舊 key=1 (‘Build a project’) vs 新 key=1 (‘Learn React’) -> 內容變了,更新文本,輸入框實例被復用(現在它顯示之前輸入的 “test”!)。

    創建一個新的 key=2 的項 (‘Build a project’)。

    結果:你原本在第二項輸入的 “test”,神奇地“跳”到了現在第二項(‘Learn React’)的輸入框里!這顯然不是用戶想要的行為。

    如何修復?

    // 正確的做法:使用唯一的 id 作為 key
    {todos.map((todo) => (<li key={todo.id}> {/* 假設每個 todo 對象都有唯一的 id */}{todo.text}<input type="text" placeholder="Edit..." /></li>
    ))}
    

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

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

相關文章

Jetson AGX Orin平臺R36.3.0版本1080P25fps MIPI相機圖像采集行缺失調試記錄

1.前言 主板:AGX Orin 官方開發套件 開發版本: R36.3.0版本 相機參數如下: 相機硬件接口: 2. 梳理大致開發流程 核對線序/定制相機轉接板 編寫camera driver驅動 編寫camera dts配置文件 調camera參數/測試出圖 前期基本流程就不多介紹了直接講正題 3. 問題描述 …

力扣hot100:螺旋矩陣(邊界壓縮,方向模擬)(54)

在解決螺旋矩陣問題時&#xff0c;我們需要按照順時針螺旋順序遍歷矩陣&#xff0c;并返回所有元素。本文將分享兩種高效的解決方案&#xff1a;邊界收縮法和方向模擬法。題目描述邊界收縮法邊界收縮法通過定義四個邊界&#xff08;上、下、左、右&#xff09;來模擬螺旋遍歷的…

[嵌入式embed][Qt]Qt5.12+Opencv4.x+Cmake4.x_用Qt編譯linux-Opencv庫 測試

[嵌入式embed][Qt]Qt5.12Opencv4.xCmake4.x_用Qt編譯linux-Opencv庫 & 測試前文:準備環境安裝qt-opencv必備庫git-clone opencv庫編譯opencv庫特殊:opencv編譯的include,編譯出來后多嵌套了一層文件夾,手工處理下改為include/opencv2測試demo新建項目QOpencv3.promain.cpp百…

百度智能云「智能集錦」自動生成短劇解說,三步實現專業級素材生產

備受剪輯壓力困擾的各位自媒體老板、MCN 同學們、投放平臺大佬們&#xff0c;解放雙手和大腦的好機會它來了&#xff01; 在這個數字化飛速發展的時代&#xff0c;智能技術正以前所未有的速度改變著我們的生活與工作方式。百度智能云&#xff0c;作為智能科技的引領者&#xf…

FPGA筆試面試常考問題及答案匯總

經歷了無數的筆試面試之后&#xff0c;不知道大家有沒有發現FPGA的筆試面試還是有很多共通之處和規律可循的。所以一定要掌握筆試面試常考的問題。FPGA設計方向&#xff08;部分題目&#xff09;1. 什么是同步邏輯和異步邏輯&#xff1f;同步邏輯 是指在同一個時鐘信號的控制下…

從0開始的github學生認證并使用copilot教程(超詳細!)

目錄 一.注冊github賬號 1.1、僅僅是注冊 1.2、完善你的profile 二、Github 學生認證 郵箱 學校名稱 How do you plan to use Github? Upload Proof 學校具體信息 一.注冊github賬號 1.1、僅僅是注冊 1.用如QQ郵箱的第三方郵箱注冊github 再添加.edu結尾的教育郵箱&…

自動駕駛叉車與 WMS 集成技術方案:數據交互、協議適配與系統對接實現

自動駕駛叉車與倉庫管理系統&#xff08;WMS&#xff09;是現代物流自動化的核心。當這兩項技術協同工作時&#xff0c;倉庫將實現前所未有的效率、準確性和可擴展性。以下是利用其集成實現最佳效果的方法。 為何集成至關重要 倉庫管理在當今運營中扮演著至關重要的角色&…

“企業版維基百科”Confluence

“企業版維基百科”Confluence Confluence 是一款由澳大利亞公司 Atlassian 開發的企業級團隊協作與知識管理軟件。您可以把它理解為一個功能非常強大的 “企業版維基百科” 或 “團隊知識庫”。 它的核心目標是幫助團隊在一個統一的平臺上創建、共享、組織和討論項目文檔、會議…

QT去除顯示的紅色和黃色下劃線的辦法

在使用 Qt Creator 開發項目時,有時候會遇到這樣的情況: 代碼明明沒有錯誤,但編輯器里卻出現了紅色或黃色的下劃線提示,甚至讓人誤以為代碼有問題。其實,這通常是 Qt Creator 的代碼模型沒有及時更新 導致的,而不是項目本身的錯誤。 為什么會出現紅色和黃色下劃線? 紅…

域內的權限提升

CVE-2020-1472域內有一個服務&#xff1a;MS-NRPC&#xff08;建立與域控安全通道&#xff09;&#xff0c;可利用此漏洞獲取域管訪問權限。檢測這個漏洞能不能打&#xff0c;能打之后&#xff0c;將域控的機器hash置空&#xff0c;密碼為空&#xff0c;那么你就可以通過空的ha…

一鍵掌握服務器健康狀態與安全風險

一鍵掌握服務器健康狀態與安全風險 在服務器運維工作中,定期對系統進行全面檢查是保障服務穩定運行的關鍵環節。手動檢查不僅耗時費力,還容易遺漏關鍵指標。今天我將為大家介紹一款功能全面的系統綜合巡檢工具,只需一鍵運行,即可完成系統狀態、性能、安全等多維度檢查,并…

線性代數第一講—向量組

文章目錄考綱術語向量組的線性表示與線性相關判別線性相關性的七大定理極大線性無關組、等價向量組、向量組的秩等價矩陣和等價向量組向量空間基本概念基變換、坐標變換 考綱術語 n維向量n維行向量n維列向量分量向量相等向量的加法向量的數乘向量的內積正交向量的模單位向量標準…

涉私數據安全與可控匿名化利用機制研究(下)

文章目錄前言三、可信數據空間支撐可控匿名化機制&#xff08;一&#xff09;基于政府可信根的可控匿名化&#xff08;二&#xff09;可信數據空間“中國模式”保障數據全生命周期合規可控&#xff08;三&#xff09;可控匿名化對大模型數據可逆風險的防御機制前言 盡管《個人…

More Effective C++ 條款25:將構造函數和非成員函數虛擬化

More Effective C 條款25&#xff1a;將構造函數和非成員函數虛擬化核心思想&#xff1a;通過虛擬構造函數和非成員函數&#xff0c;實現運行時的多態行為&#xff0c;允許在不知道對象具體類型的情況下創建新對象或執行操作&#xff0c;增強代碼的靈活性和擴展性。 &#x1f6…

血緣元數據采集開放標準:OpenLineage Guides 在 Airflow 中使用 OpenLineage Proxy

OpenLineage 是一個用于元數據和血緣采集的開放標準&#xff0c;專為在作業運行時動態采集數據而設計。它通過統一的命名策略定義了由作業&#xff08;Job&#xff09;、運行實例&#xff08;Run&#xff09;和數據集&#xff08;Dataset&#xff09; 組成的通用模型&#xff0…

【Linux】網絡(中)

目錄1. 序列化和反序列化1.1 序列化1.2 反序列化2. 網絡版本計算器&#xff08;自定義協議&#xff09;3. 再次理解OSI七層模型4. HTTP協議4.1 HTTP協議格式4.2 HTTP的方法4.3 HTTP的狀態碼4.4 HTTP常見Header4.5 長連接和短連接4.6 Cookie5. HTTPS協議5.1 對稱加密和非對稱加密…

AI 寫作實戰:用 GPT-4o+ Claude 3 生成小紅書文案,轉化率提升 30%

引言?AI 寫作開啟小紅書營銷新引擎在社交媒體營銷的浪潮中&#xff0c;小紅書以其獨特的社區氛圍和龐大的年輕用戶群體&#xff0c;成為品牌推廣的關鍵陣地。然而&#xff0c;撰寫既吸引眼球又能高效轉化的文案并非易事&#xff0c;傳統人工編寫不僅耗時費力&#xff0c;還難以…

一個月漲粉30萬,Coze智能體一鍵生成民間傳說爆款視頻,3分鐘上手

最近發現一個賬號&#xff0c;用AI將民間傳說故事轉化為生動視頻&#xff0c;短短一個月漲粉30萬&#xff0c;條均播放 量破百萬。這種視頻制作真的需要專業團隊嗎&#xff1f;今天教大家用Coze智能體工作流&#xff0c;一鍵生成 爆款民間故事視頻&#xff01;工作流功能 用Coz…

Linux arm64 PTE contiguous bit

文章目錄一、簡介1.1 contiguous PTE1.2 demo二、Linux 內核中的實現2.1 宏定義2.2 __create_pgd_mapping2.2.1 alloc_init_cont_pmdinit_pmd2.2.2 alloc_init_cont_pteinit_pte2.3 hugetlbpage2.3.1 find_num_contig2.3.2 num_contig_ptes2.3.3 huge_pte_offset2.3.4 huge_pte…

深入分析 json2(新)與標準的 jsonrpc的區別

這兩個模塊都用于實現 JSON 風格的遠程過程調用&#xff08;RPC&#xff09;接口&#xff0c;但設計哲學、使用方式、安全性和現代化程度有顯著差異。 &#x1f4c2; 對比背景 文件 功能 來源 jsonrpc.py 標準的 JSON-RPC 2.0 兼容接口 Odoo 內核已有邏輯 json2.py 自定…