Component與PureComponent使用差異詳解
這次帶給大家Component與PureComponent使用差異詳解,Component與PureComponent使用的注意事項有哪些,以下就是實戰案例,一起來看一下。
我開始轉向使用PureCompoent
是因為它是一個更具效能的Component
的版本。雖然事實證明這是正確的,但是這種性能的提高還伴隨著一些附加的條件。讓我們深挖一下PureComponent
,並理解為什麼我們應該使用它。
Component和PureComponent有一個不同點
除了為你提供了一個淺比較的shouldComponentUpdate
方法,PureComponent
和Component
基本上完全相同。當props
或state
改變時,PureComponent
將對props
和state
進行淺比較。另一方面,Component不會比較目前和下個狀態的props
和state
。因此,每當shouldComponentUpdate
被呼叫時,元件預設的會重新渲染。
淺層比較101
當把之前和下一個的props
和state
作比較,淺比較會檢查原始值是否有相同的值(例如:1 == 1
或ture==true
),陣列和物件引用是否相同。
從不改變
您可能已經聽說過,不要在props
和state
中改變物件和數組,如果您在您的父組件中改變對象,你的「pure」子元件不將更新。雖然值已經被改變,但是子元件比較的是先前props
的參考是否相同,而不會進行深度比較。
與此相反,你可以透過使用es6的assign方法或陣列的擴充運算子或使用第三方函式庫達到不可變性,來傳回一個新的物件。
存在效能問題?
比較原始值值和物件參考是低消費運算。如果你有一列子物件並且其中一個子物件更新,對它們的props
和state
進行檢查要比重新渲染每個子節點要快的多
其它解決方案
不要在render的函數中綁定值
#假設你有一個項目列表,每個項目都傳遞一個唯一的參數到父方法。為了綁定參數,你可能會這麼做:
<CommentItem likeComment={() => this.likeComment(user.id)} />
這個問題會導致每次父元件render方法被呼叫時,一個新的函數被創建,已將其傳入likeComment
。這會有一個改變每個子元件props
的副作用,它將會造成他們全部重新渲染,即使資料本身沒有改變。
為了解決這個問題,只需要將父元件的原型方法的參考傳遞給子元件。子元件的likeComment
屬性將總是有相同的引用,這樣就不會造成不必要的重新渲染。
<CommentItem likeComment={this.likeComment} userID={user.id} />
然後再子元件中建立一個引用了傳入屬性的類別方法:
class CommentItem extends PureComponent { ... handleLike() { this.props.likeComment(this.props.userID) } ... }
不要在render方法裡派生資料
考慮一下你的設定元件將從一系列文章中展示用戶最喜歡的十篇文章。
render() { const { posts } = this.props const topTen = posts.sort((a, b) => b.likes - a.likes).slice(0, 9) return //... }
每次元件重新渲染時topTen
都會有一個新的引用,即使posts
沒有改變並且派生資料也是相同的。這將造成清單不必要的重新渲染。
你可以透過快取你的衍生資料來解決這個問題。例如,設定派生資料在你的元件state
中,只有當posts更新時它才會更新。
componentWillMount() { this.setTopTenPosts(this.props.posts) } componentWillReceiveProps(nextProps) { if (this.props.posts !== nextProps.posts) { this.setTopTenPosts(nextProps) } } setTopTenPosts(posts) { this.setState({ topTen: posts.sort((a, b) => b.likes - a.likes).slice(0, 9) }) }
如果你正在使用Redux,可以考慮使用reselect來建立"selectors"來組合和快取派生資料。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是Component與PureComponent使用差異詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

C++中的眾數函數詳解在統計學中,眾數指的是一組資料中出現次數最多的數值。在C++語言中,我們可以透過寫一個眾數函數來找出任意一組資料中的眾數。眾數函數的實作可以採用多種不同的方法,以下將詳細介紹其中兩種常用的方法。第一種方法是使用哈希表來統計每個數字出現的次數。首先,我們需要定義一個哈希表,將每個數字作為鍵,出現次數作為值。然後,對於給定的資料集,我們遍

Windows作業系統是全球最受歡迎的作業系統之一,其新版本Win11備受矚目。在Win11系統中,管理員權限的取得是一個重要的操作,管理員權限可以讓使用者對系統進行更多的操作和設定。本文將詳細介紹在Win11系統中如何取得管理員權限,以及如何有效地管理權限。在Win11系統中,管理員權限分為本機管理員和網域管理員兩種。本機管理員是指具有對本機電腦的完全管理權限

OracleSQL中的除法運算詳解在OracleSQL中,除法運算是一種常見且重要的數學運算運算,用來計算兩個數相除的結果。除法在資料庫查詢中經常用到,因此了解OracleSQL中的除法運算及其用法是資料庫開發人員必備的技能之一。本文將詳細討論OracleSQL中除法運算的相關知識,並提供具體的程式碼範例供讀者參考。一、OracleSQL中的除法運算

C++中的取餘函數詳解在C++中,取餘運算子(%)用於計算兩個數相除的餘數。它是一種二元運算符,其運算元可以是任何整數型別(包括char、short、int、long等),也可以是浮點數型別(如float、double)。取餘運算子傳回的結果與被除數的符號相同。例如,對於整數的取餘運算,我們可以使用以下程式碼來實作:inta=10;intb=3;

Vue.nextTick函數用法詳解及在非同步更新中的應用在Vue開發中,經常會遇到需要進行非同步更新資料的情況,例如在修改DOM後需要立即更新資料或在資料更新後需要立即進行相關操作。而Vue提供的.nextTick函數就是為了解決這類問題而出現的。本文將會詳細介紹Vue.nextTick函數的用法,並結合程式碼範例來說明它在非同步更新中的應用。一、Vue.nex

PHP-FPM是一種常用的PHP流程管理器,用於提供更好的PHP效能和穩定性。然而,在高負載環境下,PHP-FPM的預設配置可能無法滿足需求,因此我們需要對其進行調優。本文將詳細介紹PHP-FPM的調優方法,並給予一些程式碼範例。一、增加進程數預設情況下,PHP-FPM只啟動少量的進程來處理請求。在高負載環境下,我們可以透過增加進程數來提高PHP-FPM的同時

PHP中的模運算子(%)是用來取得兩個數值相除的餘數的。在本文中,我們將詳細討論模運算子的作用及用法,並提供具體的程式碼範例來幫助讀者更好地理解。 1.模運算子的作用在數學中,當我們將一個整數除以另一個整數時,就會得到一個商和一個餘數。例如,當我們將10除以3時,商數為3,餘數為1。模運算子就是用來取得這個餘數的。 2.模運算子的用法在PHP中,使用%符號來表示模

Linux系統呼叫system()函數詳解系統呼叫是Linux作業系統中非常重要的一部分,它提供了一種與系統核心互動的方式。其中,system()函數是常用的系統呼叫函數之一。本文將詳細介紹system()函數的使用方法,並提供對應的程式碼範例。系統呼叫的基本概念系統呼叫是使用者程式與作業系統核心互動的一種方式。使用者程式透過呼叫系統呼叫函數來請求作業系統
