[書籍精讀]《React進階之路》精讀筆記分享

来源:https://www.cnblogs.com/yzsunlei/archive/2020/05/19/12920371.html
-Advertisement-
Play Games

寫在前面 書籍介紹:《React進階之路》詳細介紹了React技術棧涉及的主要技術。本書分為基礎篇、進階篇和實戰篇三部分。基礎篇主要介紹React的基本用法,包括React 16的新特性;進階篇深入講解組件state、虛擬DOM、高階組件等React中的重要概念,同時對初學者容易困惑的知識點做了介紹 ...


寫在前面

  • 書籍介紹:《React進階之路》詳細介紹了React技術棧涉及的主要技術。本書分為基礎篇、進階篇和實戰篇三部分。基礎篇主要介紹React的基本用法,包括React 16的新特性;進階篇深入講解組件state、虛擬DOM、高階組件等React中的重要概念,同時對初學者容易困惑的知識點做了介紹;實戰篇介紹React Router、Redux和MobX 3個React技術棧的重要成員,並通過實戰項目講解這些技術如何和React結合使用。
  • 我的簡評:這本書適合初級的React開發者,書名雖是進階,實際上就是一本入門的書。書中對一些React用法總結的還挺不錯,實踐性比較強。
  • !!文末有pdf書籍、筆記思維導圖、隨書代碼打包下載地址,需要請自取!閱讀[書籍精讀系列]所有文章,請移步:推薦收藏-JavaScript書籍精讀筆記系列導航

1.初識React

1.1.簡介

  • 一句話:通過引入虛擬DOM、狀態、單項數據流等設計理念,形成以組件為核心,用組件搭建UI的開發模式,理順了UI的開發過程,完美的將數據、組件狀態和UI映射到一起,極大地提高了開發大型Web應用的效率

1.2.特點

  • 聲明式的視圖層、簡單的更新流程、靈活的渲染實現、高效的DOM操作

2.React基礎

2.1.Jsx

  • 簡介:一種用於描述UI的JavaScript擴展語法
  • Jsx語法:基本語法、標簽類型、JavaScript表達式、標簽屬性、註釋
  • Jsx不是必需的

2.2.組件

  • 定義:組件將應用的UI拆分成獨立的、可復用的模塊
  • props:用於把父組件中的數據或方法傳遞給子組件,供子組件使用
  • state:組件內部的狀態,state的變化最終將反映到組件UI的變化上
  • props和state比較:props是組件對外的介面,組件通過props接收外部傳入的數據(包括方法);state是組件對內的介面,組件內部狀態的變化通過state來反映。另外,props是只讀的,state是可變的
  • 有狀態組件和無狀態組件:用不到state就稱為無狀態組件
  • 屬性校驗和預設屬性:PropTypes和defaultProps
  • 組件樣式:外部和內聯
  • 組件和元素:React元素是一個普通的JavaScript對象,React組件是一個class或函數

2.3.組件的生命周期

  • 掛載階段:constructor、componentWillMount、render、componentDidMount
  • 更新階段:componentWillReceiveProps(nextProps)、shouldComponentUpdate(nextProps, nextState)、componentWillUpdate(nextProps, nextState)、render、componentDidUpdate(prevProps, prevState)
  • 卸載階段:componentWillUnmount

2.4.列表和Keys

  • 使用key屬性來標記列表中的每個元素,通過key知道哪些元素髮生了變化,只渲染髮生變化的元素,提高渲染效率

2.5.事件處理

  • 合成事件,並不是原生的DOM事件
  • 1.使用箭頭函數
  • 2.使用組件方法
  • 3.屬性初始化語法

2.6.表單

  • 受控組件:表單元素的值是由React來管理的(input文本框、select列表、checkbox覆選框和radiobox單選框)
  • 非受控組件:表單元素的狀態依然由表單元素自己管理

3.React16新特性

  • 1.render新的返回類型:數組和字元串
  • 2.錯誤處理:錯誤邊界componentDidCatch
  • 3.Portals:任意組件都可以將彈窗組件渲染到根節點上,以方便彈窗的顯示
  • 4.自定義DOM屬性:之前會忽略不識別的HTML和SVG屬性,現在React會把不識別的屬性傳遞給DOM元素

4.深入理解組件

4.1.組件state

  • 設計合適的state
  • 正確修改state:不能直接修改state;state的更新是非同步的;state的更新是一個合併的過程;
  • state與不可變對象:狀態的類型是不可變類型;狀態的類型是數組;狀態的類型是普通對象(不包含字元串、數組);

4.2.組件與伺服器通信

  • 掛載階段通信:componentDidMount是執行組件與伺服器通信的最佳地方
  • 更新階段通信

4.3.組件間通信

  • 父子組件通信:父向子:通過父組件向子組件的props傳遞數據完成;子向父:通過父組件向子組件傳遞的回調方法;
  • 兄弟組件通信:通過狀態提升的方式實現;即把組件之間需要共用的狀態保存到距離他們最近的共同父組件內,任意一個兄弟組件都可以通過父組件傳遞的回調函數來修改共用狀態,父組件中共用狀態的變化也會通過props向下傳遞給所有兄弟組件,從而完成兄弟組件之間的通信;
  • 組件層級太深時使用Context:創建context的方式是:在提供context的組件內新增一個getChildContext方法,返回context對象,然後在組件的childContextTypes屬性上定義context對象的屬性的類型信息
  • 延伸:使用消息隊列實現組件通信:改變數據的組件發起一個消息,使用數據的組件監聽這個消息,併在響應函數中觸發setState來改變組件狀態

4.4.特殊的ref

  • 在DOM元素上使用ref:ref接收一個回調函數作為值,在組件被掛載或卸載時,回調函數會被調用。在組件被掛載時,回調函數會接收當前dom元素作為參數,在組件被卸載時,回調函數會接收null作為參數
  • 在組件上使用ref:此時ref的回調函數接收的參數是當前組件的實例,提供在組件外部操作組件的方式
  • 父組件訪問子組件的DOM節點:需要在父組件獲取子組件的某個DOM元素

5.虛擬DOM和性能優化

5.1.虛擬DOM

  • 虛擬DOM使用普通的JavaScript對象描述DOM元素

5.2.Diff演算法

  • 原理:通過比較兩次虛擬DOM結構的變化找出差異部分,更新到真實DOM上,從而減少對真實DOM上執行的操作,提高程式執行效率
  • 幾種情況:1.當根節點是不同類型時;2.當根節點是相同的DOM元素類型時;3.當根節點是相同的組件類型時;

5.3.性能優化

  • 1.使用生產環境版本的庫
  • 2.避免不必要的組件渲染
  • 3.使用key

5.4.性能檢測工具

  • React Developer Tools for Chrome
  • Chrome Performance Tab

6.高階組件

6.1.基本概念

  • 接收React組件作為參數,並且返回一個新的React組件。實現方式本質上是裝飾者模式

6.2.使用場景

  • 1.操作props
  • 2.通過ref訪問組件實例
  • 3.組件狀態提升
  • 4.用其他元素包裝組件

6.4.繼承實現高階組件

  • 屬性代理實現高階組件:由高階組件處理通用邏輯,然後將相關屬性傳遞給被包裝組件
  • 還可以通過繼承方式實現高階組件,通過繼承被包裝組件實現邏輯的復用

6.5.註意事項

  • 1.為更好地區別包裝了不同組件的高階組件,需要對高階組件的顯示名稱做自定義處理
  • 2.不要在組件的render方法中使用高階組件,儘量也不要在組件的其他生命周期方法中使用高階組件
  • 3.如果需要使用被包裝組件的靜態方法,必須手動複製這些靜態方法
  • 4.refs不會被傳遞給被包裝組件
  • 5.與父組件的區別

7.路由:用React Router開發單頁面應用

  • 7.1.前端路由的實現方式
  • 7.2.Router對象
  • 7.3.Route是React Router中用於配置路由信息的組件
  • 7.4.Link鏈接組件

8.Redux:可預測的狀態管理機

8.1.三大原則

  • 1.唯一數據源
  • 2.保持應用狀態只讀
  • 3.應用狀態的改變通過純函數完成

8.2.主要組成

  • 1.action:信息的載體
  • 2.reducer:描述應用發生了什麼操作
  • 3.store:是action和reducer之間的橋梁

8.3.store負責的工作

  • 1.保存應用狀態
  • 2.通過方法getState()訪問應用狀態
  • 3.通過方法dispatch(action)發送更新狀態的意圖
  • 4.通過方法subscribe(listener)註冊監聽函數、監聽應用狀態的改變

9.Redux實戰

9.1.組織項目結構

  • 目前主流的方案有三種:按照類型、按照頁面功能和Ducks
  • 按照類型:就是將充當component、container、action、reducer等不同角色的文件分別放在不同的文件夾下。問題:項目規模較大時,非常不方便
  • 按照頁面功能:就是將一個頁面功能使用到的組件、狀態和行為都在同一個文件夾下。優點:方便開發、易於功能的擴展。問題:需要頻繁在reducer、action、action type等不同文件間切換
  • Ducks:提倡將相關聯的reducer、action types和action creators寫到一個文件里。本質上是以應用的狀態作為劃分模塊的依據,而不是以界面功能作為劃分模塊的依據。

9.2.設計state

  • 錯誤1:以API作為設計的state的依據
  • 錯誤2:以頁面UI作為設計state的依據
  • 合理設計state:最重要的是記住一句話:像設計資料庫一樣設計state;類似設計資料庫總結的三個原則(1.把整個應用的狀態按照領域分為若幹個子狀態,子狀態之間不能保存重覆的數據;2.state以鍵值對的結構存儲數據,以記錄的key或ID作為記錄的索引,記錄中的其他欄位都依賴於索引;3.state中不能保存可以通過state中的已有欄位計算而來的數據,即state中的欄位不互相依賴;)

9.3.設計模塊

  • app模塊、auth模塊、posts模塊、comments模塊、users模塊、ui模塊、index模塊

9.4.連接Redux

  • 註入state
  • 註入action creators
  • connecte連接PostList和Redux

9.5.Redux調試工具

  • Redux DevTools
  • 一款用於調試Redux應用的瀏覽器插件,可以實時的顯示當前應用的state信息、action觸發的記錄以及state的變化

9.6.性能優化

  • React Router引起的組件重覆渲染問題
  • Immutable.js:Redux的state必須是不可變對象,reducer中每次返回的state都是一個新對象;Immutable.js的作用在於以更高效的方式創建不可變對象;主要3個優點(保證數據的不可變、豐富的API、優異的性能)
  • Reselect:Redux state的任意改變都會導致所有容器組件的mapStateToProps的重新調用,進而導致使用到的selectors重新計算;Reselect可以創建具有記憶功能的selectors,當selectors計算使用的參數未發生變化時,不會再次計算,而是直接使用上次緩存的計算結果;

寫在後面


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 數據科學部為想從事大數據方向學習的小伙伴總結了一下大數據的學習路線,供大家學習參考。由於大數據是一個基礎門檻較高就業前景較好的學習方向。所以打算學習大數據的小伙伴要加油啦! 大數據學習路線: 首先我要瞭解大數據處理流程: 第一步:數據收集 第二部:數據存儲 第三步:數據分析 第四步:數據應用 ... ...
  • 問題 經常在PG群里看到有人在問“為什麼我對錶賦予了許可權;但是還是不能訪問表” 解析 若你看懂德哥這篇文章PostgreSQL邏輯結構和許可權體系介紹;上面對你就不是困擾你的問題 解決這個問題很簡單;在解決之前;我們要先瞭解PostgreSQL的邏輯結構、以及與用戶之間的關係。盜用德哥的圖;來詮釋下邏 ...
  • #獲取會員的上二級 drop view if exists vwMemberL2Parent; create view vwMemberL2Parent as select m.id, m.parent_id, m.nickname, m.realname, m.avatar, m.mobile, ...
  • 這是大數據入門常識第二篇,主要討論大數據工作的方向問題。第一篇沒看的同學可以補一下: "3000字長文教你大數據該怎麼學!" 有不少剛入門的同學在後臺會問類似這樣的問題 看招聘網站上,大數據相關的方向好多,不知道自己適合哪個怎麼辦? 關註我公眾號的同學應該有不少是剛入門的,所以我把內容好好地整理總結 ...
  • IsEqual與Hash個人理解 isEqual NSObject類的實例方法: 主要是根據對象的記憶體地址來判斷兩個對象是否相等,這裡與 效果相同。 isEqualToString (BOOL)isEqualToString:(NSString )aString 是NSString類的實例方法,它主 ...
  • 希望通過這篇文章從頭到尾梳理一下 iOS 中涉及到渲染原理相關的內容,會先從電腦渲染原理講起,慢慢說道 iOS 的渲染原理和框架,最後再深入探討一下離屏渲染。 希望能對大家有點幫助~ 1. 電腦渲染原理 CPU 與 GPU 的架構 對於現代電腦系統,簡單來說可以大概視作三層架構:硬體、操作系統 ...
  • 1. SELinux 背景知識 1.1 DAC 與 MAC 在 SELinux 出現之前,Linux 上的安全模型叫 DAC,全稱是 Discretionary Access Control,翻譯為自主訪問控制。 DAC 的核心思想很簡單,就是:進程理論上所擁有的許可權與執行它的用戶的許可權相同。比如, ...
  • 一、Swich語句 1.switch語句格式 swich(條件表達式){ case 表達式: 語句1; break; case 表示式: 語句2; break; case 表達式: 語句3: break; default: 語句n+1; break; } 註意點: (1)JS中判斷是否相等時是全等於 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...