React.Component(V16.8.6)

組件的生命周期

掛載

當組件實例被創建并插入 DOM 中時,其生命周期調用順序如下:

  • constructor()
  • static getDerivedStateFromProps()
  • render()
  • componentDidMount()

componentWillMount() 之后將廢棄

更新

當組件的 props 或 state 發生變化時會觸發更新。組件更新的生命周期調用順序如下:

  • static getDerivedStateFromProps()
  • shouldComponentUpdate()
  • render()
  • getSnapshotBeforeUpdate()
  • componentDidUpdate()

componentWillUpdate() 、 componentWillReceiveProps() 之后將被廢棄

卸載

當組件從 DOM 中移除時會調用如下方法:

  • componentWillUnmount()

錯誤處理

當渲染過程,生命周期,或子組件的構造函數中拋出錯誤時,會調用如下方法:

  • static getDerivedStateFromError()
  • componentDidCatch()

組件還提供了一些額外的 API:

  • setState()
  • forceUpdate()

單獨介紹

getDerivedStateFromProps

這個生命周期函數是為了替代 componentWillReceiveProps 存在的,所以在你需要使用componentWillReceiveProps的時候,就可以考慮使用getDerivedStateFromProps來進行替代了。

兩者的參數不相同的,而getDerivedStateFromProps是一個靜態函數,也就是這個函數不能通過this訪問到class的屬性,也并不推薦直接訪問屬性。

而是應該通過參數提供的nextProps以及prevState來進行判斷,根據新傳入的props來映射到state。

需要注意的是,如果props傳入的內容不需要影響到你的state,那么就需要返回一個null,這個返回值是必須的,所以盡量將其寫到函數的末尾。

static getDerivedStateFromProps(nextProps, prevState) {const {type} = nextProps;// 當傳入的type發生變化的時候,更新stateif (type !== prevState.type) {return {type,};}// 否則,對于state不進行任何操作return null;
}

如果你的組件內部既需要修改自己的type,又需要接收從外部修改的type。

static getDerivedStateFromProps(nextProps, prevState) {const {type} = nextProps;// type可能由props驅動,也可能由state驅動,這樣判斷會導致state驅動的type被回滾if (type !== prevState.type) {return {type,};}// 否則,對于state不進行任何操作return null;
}

在非必須的時候,摒棄這種寫法。type要么由props驅動,要么完全由state驅動。

如果實在沒有辦法解耦,那么就需要一個hack來輔助:綁定props到state上。

constructor(props) {super(props);this.state = {type: 0,props,}
}
static getDerivedStateFromProps(nextProps, prevState) {const {type, props} = nextProps;// 這段代碼可能看起來非常混亂,這個props可以被當做緩存,僅用作判斷if (type !== props.type) {return {type,props: {type,},};}// 否則,對于state不進行任何操作return null;
}

上面的代碼可以保證在進行多數據源驅動的時候,狀態能夠正確改變。當然,這樣的代碼很多情況下是會影響到別人閱讀你的代碼的,對于維護造成了非常大的困難。

getSnapshotBeforeUpdate(prevProps, prevState)

getSnapshotBeforeUpdate() 在最近一次渲染輸出(提交到 DOM 節點)之前調用。它使得組件能在發生更改之前從 DOM 中捕獲一些信息(例如,滾動位置)。此生命周期的任何返回值將作為參數傳遞給 componentDidUpdate()。

此用法并不常見,但它可能出現在 UI 處理中,如需要以特殊方式處理滾動位置的聊天線程等。

應返回 snapshot 的值(或 null)。

class ScrollingList extends React.Component {constructor(props) {super(props);this.listRef = React.createRef();}getSnapshotBeforeUpdate(prevProps, prevState) {// 我們是否在 list 中添加新的 items ?// 捕獲滾動位置以便我們稍后調整滾動位置。if (prevProps.list.length < this.props.list.length) {const list = this.listRef.current;return list.scrollHeight - list.scrollTop;}return null;}componentDidUpdate(prevProps, prevState, snapshot) {// 如果我們 snapshot 有值,說明我們剛剛添加了新的 items,// 調整滾動位置使得這些新 items 不會將舊的 items 推出視圖。//(這里的 snapshot 是 getSnapshotBeforeUpdate 的返回值)if (snapshot !== null) {const list = this.listRef.current;list.scrollTop = list.scrollHeight - snapshot;}}render() {return (<div ref={this.listRef}>{/* ...contents... */}</div>);}
}

在上述示例中,重點是從 getSnapshotBeforeUpdate 讀取 scrollHeight 屬性,因為 “render” 階段生命周期(如 render)和 “commit” 階段生命周期(如 getSnapshotBeforeUpdate 和 componentDidUpdate)之間可能存在延遲。

Error boundaries

Error boundaries 是 React 組件,它會在其子組件樹中的任何位置捕獲 JavaScript 錯誤,并記錄這些錯誤,展示降級 UI 而不是崩潰的組件樹。Error boundaries 組件會捕獲在渲染期間,在生命周期方法以及其整個樹的構造函數中發生的錯誤。

如果 class 組件定義了生命周期方法 static getDerivedStateFromError()componentDidCatch() 中的任何一個(或兩者),它就成為了 Error boundaries。通過生命周期更新 state 可讓組件捕獲樹中未處理的 JavaScript 錯誤并展示降級 UI。

僅使用 Error boundaries 組件來從意外異常中恢復的情況;不要將它們用于流程控制。

static getDerivedStateFromError(error)

此生命周期會在后代組件拋出錯誤后被調用。 它將拋出的錯誤作為參數,并返回一個值以更新 state

class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// 更新 state 使下一次渲染可以顯降級 UIreturn { hasError: true };}render() {if (this.state.hasError) {// 你可以渲染任何自定義的降級  UIreturn <h1>Something went wrong.</h1>;}return this.props.children; }
}

注意:getDerivedStateFromError() 會在渲染階段調用,因此不允許出現副作用。 如遇此類情況,請改用 componentDidCatch()。

componentDidCatch(error, info)

componentDidCatch() 會在“提交”階段被調用,因此允許執行副作用。 它應該用于記錄錯誤之類的情況:

class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// 更新 state 使下一次渲染可以顯示降級 UIreturn { hasError: true };}componentDidCatch(error, info) {// "組件堆棧" 例子://   in ComponentThatThrows (created by App)//   in ErrorBoundary (created by App)//   in div (created by App)//   in ApplogComponentStackToMyService(info.componentStack);}render() {if (this.state.hasError) {// 你可以渲染任何自定義的降級 UIreturn <h1>Something went wrong.</h1>;}return this.props.children; }
}

setState的異步操作

因為setState是異步的,所有有時setState后獲取this.state數據并不準確,可以如下操作:

state = {name:'initName'
}this.setState((state,props)=>{console.log(state,props);return {name:'name-change'};
})const {name}=this.state;
this.setState({name:'name-change'},()=>{console.log(this.state.name,name)   // name-change initName
})

官方文檔:https://zh-hans.reactjs.org/docs/react-component.html#static-getderivedstatefromprops

轉載于:https://www.cnblogs.com/adoctors/p/10976931.html

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

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

相關文章

mysql date類型加一個月jdbc_JDBC操作數據庫Date類型數據

JDBC操作數據庫Date類型數據由于java原生的工具類java.util提供的Date對象與JDBC提供的Date對象并不相同分別是java.util.Date和java.sql.Datejava.sql.Date是java.util.Date的子類所以在進行增刪改查部分操作中&#xff0c;不能直接將原生工具類的Date對象直接運用到JDBC中可以…

使用深度學習TensorFlow框架進行圖片識別

Apsara Clouder大數據專項技能認證&#xff1a;使用深度學習TensorFlow框架進行圖片識別本認證系統的介紹了深度學習的一些基礎知識&#xff0c;以及Tensorflow的工作原理。通過阿里云機器學習PAI基于經典的CIFAR-10數據集實現圖片識別。學員可以通過本實驗&#xff0c;對深度學…

刪除開發分支 新建另一個開發分支

//查看狀態 git status //查看分支 會有一個分支git branch -d wlh-dev git branch //刪除wlh-dev 分支 git branch -d wlh-dev //再次查看分支 git branch //拉代碼 git pull //查看狀態 git status //新分支創建的同時切換分支 git checkout -b wlh-dev1222 //…

ES語法及-IK分詞器

{"query": {"query_string": {"default_field": "title",//全文搜索"query": "器大"}} } "id":1, "title":"Elasticsearch是一個基于Lucene的搜索服務器", "content":&q…

Git倉庫配置

安裝git依賴包 yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker 源碼安裝 wget https://github.com/git/git/archive/v2.7.4.zip unzip v2.7.4.zip cd git-2.7.4 make prefix/usr/local/git all make prefix/usr/l…

python3 tkinter電子書_Python3 Tkinter-Text

1.創建from tkinter import *rootTk()tText(root)t.pack()root.mainloop()2.添加文本from tkinter import *rootTk()tText(root)t.insert(1.0,0123456789)t.insert(1.0,ABDCEFGHIJ)t.pack()root.mainloop()3.設置添加位置from tkinter import *rootTk()tText(root)for i in ran…

問題 1: 區間交集

問題 1: 區間交集 題目描述 輸入 5 個正整數 a1、b1、a2、b2 和 c&#xff0c;如果 c 在區間[a1, b1]內 并且 c 也在區間[a2, b2]內&#xff0c;輸出”in”&#xff0c;否則輸出”out”。 注意&#xff1a;方括號表示的是閉區間&#xff0c;[a, b]是包括 a 和 b 的。 輸入 一行…

python倒三角形粉色填充筆的形狀海龜_Python001-Turtle(海龜繪圖)詳解

一、簡介Turtle庫是Python語言中的一個繪制圖像的函數庫。詳細文檔&#xff1a; https://docs.python.org/zh-cn/3/library/turtle.html二、使用1.畫布設置(canvas)(1)設置畫布大小turtle.screensize(canvwidthNone, canvheightNone, bgNone)參數分別為畫布的寬(單位像素), 高,…

Python 提取數據庫(Postgresql)并郵件發送

剛入門python&#xff0c;發現確實是一個不錯的語言。業務部門要求將將某一個數據庫中的表&#xff0c;定期發送到相關部門人員郵箱。其實整個業務需求很簡單&#xff0c;實現起來也不難。但是由于剛入門python&#xff0c;所以還是借鑒了不上網上的內容&#xff0c;也得到了許…

4.Python的不堪一擊到初學乍練(列表,元組)

Python(列表,元組) 一.列表 列表初識 列表是python的基礎數據類型之一,其他編程語言也有類似的數據類型. 比如JS中的數組, java中的數組等等,它是以[ ]括起來, 每個元素用","隔開并且可以存放各種數據類型.列表相比于字符串,不僅可以存放不同的數據類型,并且可以存放…

【前端工程師手冊】說清楚JavaScript中的相等性判斷

有哪些判斷相等性的方法 JavaScript現在提供了三種方法來判斷相等性&#xff1a; &#xff0c;三個等號即嚴格相等&#xff0c;兩個等號即寬松相等Object.is()&#xff0c;ES6中用來判斷相等的方法判斷相等性的細節 &#xff08;嚴格相等&#xff09; 被比較的兩個數不會進行類…

python多任務編程_python線程的多任務編程

多任務多任務介紹對于人來說&#xff0c;一邊聽歌&#xff0c;一邊跳舞就是多任務。對于電腦&#xff0c;簡單的說&#xff0c;同一時間執行多個程序處理數據叫做多任務多任務理解單核CPU單核cpu在處理多任務的時候是根據時間片輪轉的方式進行的&#xff0c;比如執行QQ1us&…

列舉python的5個數據類型_python公開課|新公布的5個python核心數據類型,這些細節你難道還不不知道嗎...

【摘要】在這個科學技術高速發展的時代&#xff0c;越來越多的人都開始選擇學習編程軟件&#xff0c;那么首先被大家選擇的編程軟件就是python&#xff0c;也用在各行各業之中&#xff0c;并被大家所熟知&#xff0c;所以也有越來越多的python學習者關注python就業方向問題&…

selenium3 + python - page_source頁面源碼

前言&#xff1a; 有時候通過元素的屬性的查找頁面上的某個元素&#xff0c;可能不太好找&#xff0c;這時候可以從源碼中爬出想要的信息。selenium的page_source方法可以獲取到頁面源碼。 本次以博客園為例&#xff0c;先爬取頁面源碼&#xff0c;通過re正則表達式爬取出url&a…

簡單分析Guava中RateLimiter中的令牌桶算法的實現

為什么80%的碼農都做不了架構師&#xff1f;>>> 令牌桶算法是網絡流量整形&#xff08;Traffic Shaping&#xff09;和速率限制&#xff08;Rate Limiting&#xff09;中最常使用的一種算法。典型情況下&#xff0c;令牌桶算法用來控制發送到網絡上的數據的數目&am…

gcc oracle mysql_Linux下C語言訪問Oracle數據庫Demo

前提條件1. Linux環境已經存在&#xff0c;安裝好了Oracle本demo 運行環境本地環境 RedHat LINUX AS 4 ,ORACLE 10G本地數據庫sid orcl,ip:127.0.0.1,用戶名:kingbi&#xff0c;密碼&#xff1a;kingbi,表dsd_test. 顯示表dsd_test 的所有記錄.步驟&#xff1a;(1) 創建表 …

煉數成金數據分析課程---16、機器學習中的分類算法(交叉內容,后面要重點看)...

煉數成金數據分析課程---16、機器學習中的分類算法&#xff08;交叉內容&#xff0c;后面要重點看&#xff09; 一、總結 一句話總結&#xff1a; 大綱實例快速學習法 主要講解常用分類算法(如Knn、決策樹、貝葉斯分類器等)的原理及python代碼實現 1、什么是分類&#xff1f; 分…

NFS配置詳解

1、NFS服務介紹1.1 什么是NFS&#xff1f;NFS是Network File System的縮寫。中文意思是網絡文件系統。它的主要功能是通過網絡&#xff08;一般是局域網&#xff09;讓不同的主機系統之間可以共享文件或者目錄。NFS客戶端&#xff08;一般為應用服務器&#xff0c;例如web&…

idea用法

更新gradle的依賴后&#xff0c;刷新項目引入jar包的方法&#xff1a; view--Tool Buttons 在右側 Gradle 點刷新 轉載于:https://www.cnblogs.com/z360519549/p/10994897.html

linux備份mysql需要暫停服務嗎_【MySQL運維】線上MySQL數據庫停服遷移流程

一、數據備份與恢復階段&#xff0c;選在凌晨1點進行操作&#xff0c;暫停服務進行備份(允許停服2個小時)1、首先停止Nginx服務&#xff0c;并且修改數據庫用戶密碼&#xff0c;防止還有新的連接進來2、殺掉某個用戶所有進程for i in mysql -udba -pPASSWORD -ssse "show …