React-引領未來的用戶界面開發框架-讀書筆記(五)

第11章 性能優化

Reactde Dom diff算法使我們能夠在任意時間點高效地重新繪制整個用戶界面,并保證最小程度的DOM改變,然而,也存在需要對組件進行細致優化的情況,這時就需要渲染一個新的DOM來讓應用運行得更加高效。

shouldComponentUpdate

當一個組件更新時,無論是設置了新的props還是調用了setState方法,或者forceUpdate方法,React都會調用該組件所有的子組件的render方法。在大多數時候這樣的操作都沒有問題,但是在組件樹深度嵌套或是render方法十分復雜的頁面上,這可能會帶來些許延遲。

有時候組件的render方法會在不必要的情況下被調用。比如:組件渲染的過程中,并沒有使用props或者state的值,或者組件的props或者state并沒有在父組件重新渲染時發生改變。這意味著重新渲染這個組件會得到和已知虛擬DOM一模一樣的結果,這樣的計算過程是沒有必要的。

React提供了一個組件的生命周期方法shouldComponentUpdate,我們可以使用它來幫助React正確判斷是否需要調用組件的render方法。

shouldComponentUpdate方法返回一個布爾值。如果返回false就是告訴React不要調用組件的渲染方法,并使用之前渲染好的虛擬DOM;如果返回true則是讓React調用組件的渲染方法并計算出新的虛擬DOM。在默認情況下,shouldComponentUpadte方法永遠都會返回true,因此組件總是會調用render方法。

組件首次被渲染時,shouldComponentUpdate方法并不會被調用,shouldComponentUpdate方法接受兩個參數,即新的props和新的state,以幫助你決定是否應該重新渲染。

不可變性輔助插件

在需要比較對象以確定是否更新時,使用不可變得數據結構讓你的shouldComponentUpdate方法變得更加簡單。我們可以使用React.addons.update來確保<SurverEditor />組件得不可變性。

React.addons.update接受一個數據結構和一個配置對象。你可以在配置對象中傳入$slice、$push、$unshift、$set和$apply

深入調查拖慢你應用的部分

正如我們在前幾小節中提到的那樣,給組件添加一個自定義的shouldComponentUpdate方法能夠在很大程度上優化程序。

React.addons.Perf插件能夠幫助我們找到添加shouldComponentUpdate方法的最佳位置。

鍵(Key)

多數時候,你會看到列表中使用key屬性的情況,它的作用是給React提供一種除組件類之外的識別一個組件的方法。舉個例子:假設有一個div組件,它的key屬性是foo,后續又將它改成了bar,那么React就會跳過DOM diff,同時完全放棄div所有的子元素,并重新從頭開始渲染。

在渲染大型子樹以避免diff計算時,這樣的設計很有用——因為這種計算就是在浪費時間。除了告訴React什么時候拋棄一個節點之外,很多情況下key還可以在元素順序改變時候使用,舉個例子:

var items=sortBy(this.state.sortingAlgorithm,this.props,items);
return items.map(funciton (item){return <img src={item.src}/};
});

如果順序發生改變,React會對元素進行diff操作,并確定出最高效的操作是改變其中幾個img元素的src屬性。這樣的結論其實是非常低效的,同時可能會導致瀏覽器查詢緩存,甚至導致新的網絡請求。

要解決這個問題,我們可以給每個img元素簡單的添加一些獨一無二的字符串或者數字。?return <img src={item.src} key={item.id}/>;

這樣React得出的結論就不是改變src屬性,而是使用insertBefore操作,而這個操作是移動DOM節點最高效的方法。

除了改變順序外,這個操作同樣適用于插入操作(不包括向末尾元素后面插入)。如果沒有正確的key屬性,在數組開頭插入一個項目會導致后續的<img>標簽的src屬性發生改變。

值得注意的一點是,盡管key看似被作為一個屬性傳入了,但其實在組件的任何位置都無法實際獲取到它。

總結

  1. 將shouldComponentUpdate返回值改為true或者false以提升性能。
  2. 使用React.addons.Perf來診斷緩慢或不必要的渲染。
  3. 使用key來幫助,React識別列表中所有子組件的最小變化。

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

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

相關文章

oneproxy檢測主從復制同步延遲

Q:為什么要實現讀寫分離延遲檢測&#xff1f; A:就好比你在ATM機存錢&#xff0c;你老婆收到短信后樂呵呵的拿網銀APP查看&#xff0c;結果錢沒過來。其實錢已經到賬了&#xff0c;只是查詢的ATM機節點錢還沒過來。所以我們dba要監控數據&#xff0c;一旦發現錢沒有復制到另一A…

.NET 分表分庫動態化處理

介紹本期主角:ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案&#xff0c;具有零依賴、零學習成本、零業務代碼入侵我不是efcore怎么辦這邊肯定有小伙伴要問有沒有不是efcore的,我這邊很確信的和你講有并且適應所有的ADO.NET包括sqlhelperShardingCo…

addEventListener 的事件函數的傳遞【轉載】

addEventListener 參數如下&#xff1a; addEventListener(type, listener[, useCapture]); type&#xff0c;事件名稱listener&#xff0c;事件處理器useCapture&#xff0c;是否捕獲一直把 listener 記成是響應函數&#xff0c;function 類型。相信很多人也是這么理解的。多數…

Android之elevation實現陰影效果

1 需求 需要控件實現陰影效果 2 實現 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"andr…

十、小程序實戰 (IVX 快速開發教程)

十、小程序實戰 使用小程序完成一個二手信息站點與 WebApp 實現流程類型&#xff0c;只是部分內容使用了微信小程序特有的組件&#xff0c;例如微信登錄與 WebApp 略有差別&#xff0c;其它邏輯實現較為類似。我們先制作頁面&#xff0c;之后再實現功能。 由于之前已經完成了…

【VB測繪程序設計】第一章 VB測繪程序設計概述

目 錄 第一節 測繪程序設計的意義 第二節 程序設計語言的發展 第三節 測繪程序設計語言的選擇

類屬性和實例屬性沖突

類屬性和實例屬性名字沖突怎么辦 修改類屬性會導致所有實例訪問到的類屬性全部都受影響&#xff0c;但是&#xff0c;如果在實例變量上修改類屬性會發生什么問題呢&#xff1f;class Person(object):address Earthdef __init__(self, name):self.name namep1 Person(Bob) p2…

源代碼下載 第六章 注解式控制器詳解

2019獨角獸企業重金招聘Python工程師標準>>> 源代碼請到附件中下載。 其他下載&#xff1a; 跟著開濤學SpringMVC 第一章源代碼下載 第二章 Spring MVC入門 源代碼下載 Controller接口控制器詳解 源代碼下載 源碼下載——第四章 Controller接口控制器詳解——跟著開…

Android6.0到底有什么不一樣

在android 6.0&#xff08;API 23&#xff09;中&#xff0c;Google已經移除了移除了Apache HttpClient相關的類 http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html 本文轉自屠夫章哥 51CTO博客&#xff0c;原文鏈接&#xff1a;…

WPF|快速添加新手引導功能(支持MVVM)

閱讀導航前言案例一案例二案例三&#xff08;本文介紹的方式&#xff09;如何使用&#xff1f;控件如何開發的&#xff1f;總結1. 前言案例一站長分享過 眾尋 大佬的一篇 WPF 簡易新手引導 一文&#xff0c;新手引導的效果挺不錯的&#xff0c;如下圖&#xff1a;該文給出的代碼…

三、界面介紹(IVX快速手冊)

三、集成開發環境界面介紹 通過本節你將了解 iVX 在線集成開發環境 界面&#xff0c;快速建立對 在線集成開發環境 的認識。 文章目錄三、集成開發環境界面介紹3.1 界面區域3.2 舞臺3.3 組件工具欄3.4 對象樹/素材面板3.5 屬性面板3.6 菜單面板3.7 邏輯工具面板3.8 輔助工具3.…

Android studio之提示Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46

1、錯誤提示如下 Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46 Show in Project Structure dialog Affected Modules: app2、解決辦法 在project的build.gradle里面加入 maven { url https://jitpack.io }

【VB測繪程序設計】第二章 VB測繪程序基礎

第一節 數據類型 VB中提供了以下11中基本的數據類型: 一、數值型 二、字符串 三、日期型 1.界面設計 2. 代碼 <

React-引領未來的用戶界面開發框架-讀書筆記(六)

第12章 服務端渲染 想讓搜索引擎抓取到你的站點&#xff0c;服務端渲染這一步不可或缺&#xff0c;服務端渲染還可以提升站點的性能&#xff0c;因為在加載JavaScript腳本的同時&#xff0c;瀏覽器就可以進行頁面渲染。 React的虛擬DOM是其可被用于服務端渲染的關鍵。首先每個R…

TrimPath - Js模板引擎

當頁面中引用template.js文件之后&#xff0c;腳本將創建一個TrimPath對象供你使用。 parseDOMTemplate(elementId,optionalDocument)  //獲得模板字符串代碼 得到頁面中Id為elementId的DOM組件的InnerHTML&#xff0c;將其解析成一個模板&#xff0c;這個返回一個templateOb…

appserv安裝

Appserv 官網: http://www.appservnetwork.com/ 安裝好后&#xff0c;輸入http://localhost:8082/驗證是否裝成功&#xff0c;成功后如下圖 http://localhost:8082/ 默認指定的文件夾是 進入到phpMyAdmin 的賬號是root&#xff0c;密碼是安裝時的密碼

一、iVX簡介(IVX 快速開發教程)

一、iVX簡介 通過本節你將對 iVX 有一個大致的認識&#xff0c;并且了解 iVX 能夠做些什么&#xff0c;有哪一些優勢&#xff0c;這將幫助你更好的上手 iVX 進行應用的開發&#xff0c;初步了解 iVX 的強大之處。 文章目錄一、iVX簡介1.1 iVX 是什么&#xff1f;1.2 iVX適合怎…

WPF效果第一百八十六篇之又玩ListBox

大周末的接著上一篇玩耍TreeView,這二天又再次去玩耍ListBox;畢竟是我的最愛,沒辦法就喜歡玩耍他;閑話也不多扯了,直接看咱們最終效果:2、原來一直ItemTemplate,這次直接ListBoxItem的Template:<Setter Property"Template"><Setter.Value><ControlTem…

Android之URL “page={page}category_id={***} string For dynamic query parameters use @Query.

1、問題 我們用retrofit進行Get網絡請求的時候&#xff0c;我代碼是這樣寫的 GET("/api/get_****/***?page{page}&category_id{category_id}")suspend fun getWebsiteCategory(Path("page") page: Int, Path("category_id") category_id: …

【VB測繪程序設計】第三章 VB結構化程序設計(順序、選擇、循環)

目 錄 第一節 順序結構設計 第二節 選擇結構設計 第三節 循環結構設計 第一節 順序結構設計 一、賦值語句