新聞動(dòng)態(tài)
一名中/高級(jí)前端工程師的自檢清單-React 篇
常見問題 發(fā)布者:ou3377 2021-12-15 09:10 訪問量:144
官方的解釋:React 是一個(gè) UI 庫(kù),它的核心思想是UI=F(data)
, 即界面的呈現(xiàn)是由函數(shù)傳入的參數(shù)決定的
開發(fā)者不再需要關(guān)心界面時(shí)如何渲染的,只要關(guān)心數(shù)據(jù)的生成和傳遞,這大大提高的開發(fā)者的開發(fā)效率,節(jié)省了開發(fā)時(shí)間
其次 React 設(shè)計(jì)的
JSX
語(yǔ)法來描述視圖虛擬DOM
修改真實(shí)DOM
setState
修改數(shù)據(jù)生命周期
階段做不同的事事件委托
的方式來捕獲 DOM 事件等特性進(jìn)一步簡(jiǎn)化的 真實(shí) DOM 操作的復(fù)雜性
虛擬DOM
真實(shí)DOM
就是我們?cè)跒g覽器開發(fā)者工具中看到的DOM
結(jié)構(gòu)虛擬DOM
簡(jiǎn)單來說就是 JS 對(duì)象,此對(duì)象中的字段包含了對(duì)真實(shí)DOM
的描述:type
:是什么標(biāo)簽/元素props
:標(biāo)簽/元素有哪些屬性children
:是否有子元素a
當(dāng) DOM
操作(渲染更新)比較頻繁時(shí),
React 底層會(huì)先將前后兩次的虛擬DOM
樹進(jìn)行對(duì)比,
定位出具體需要更新的部分,生成一個(gè)補(bǔ)丁集
,
最后只把“補(bǔ)丁”打在需要更新的那部分真實(shí)DOM
上,實(shí)現(xiàn)精準(zhǔn)的“差量更新”。
如果當(dāng)虛擬 DOM 的構(gòu)建和diff
的過程相對(duì)復(fù)雜(比如很多遞歸遍歷等操作),那么虛擬 DOM 的 JS 計(jì)算是比較耗時(shí)的
Diff算法
一般的原始 diff 思路算法復(fù)雜度是O(n^3)
,即循環(huán)遞歸進(jìn)行樹節(jié)點(diǎn)的一一對(duì)比
但 React 的 diff 算法
是 O (n)
復(fù)雜度的思路
當(dāng)對(duì)比兩棵虛擬 DOM 樹時(shí),React 首先比較兩棵樹的根節(jié)點(diǎn)。不同類型的根節(jié)點(diǎn)元素會(huì)有不同的形態(tài)
當(dāng)對(duì)比兩個(gè)相同類型的 React 元素時(shí),React 會(huì)保留 DOM 節(jié)點(diǎn),僅比對(duì)及更新有改變的屬性。
Diff
過程中冗余的遞歸操作key 屬性
。當(dāng)子元素?fù)碛?nbsp;key
時(shí),React 使用 key
來匹配原有樹上的子元素以及最新樹上的子元素,如果 key
不同 不同則會(huì)拆卸原有的 key
節(jié)點(diǎn)并且建立起新的 key
節(jié)點(diǎn)詳細(xì)內(nèi)容請(qǐng)參考React 官方文檔- Diffing 算法[2]
image.png
constructor()
:組件的構(gòu)造函數(shù),組件更新到界面上之前會(huì)先調(diào)用
state
的地方static getDerivedStateFromProps(nextProps, prevState)
:用于從外部的屬性去初始化一些內(nèi)部的狀態(tài)
state
需要從 props
初始化時(shí)使用state/props
狀態(tài)一致性會(huì)增加復(fù)雜度render
都會(huì)調(diào)用render()
::組件必須定義的一個(gè)生命周期方法,用來描述 虛擬 DOM 結(jié)構(gòu)
componentDidMount()
: 用于數(shù)據(jù)請(qǐng)求,定義一些外部資源等等副作用
static getDerivedStateFromProps(nextProps, prevState)
shouldComponentUpdate(nextProps, nextState)
:告訴組件是否需要重新渲染,用于性能優(yōu)化,比如判定指定 props 發(fā)生改變,組件才進(jìn)行重新渲染PureComponent
自動(dòng)實(shí)現(xiàn)render()
getSnapshotBeforeUpdate(prevProps, prevState)
componentDidUpdate
搭配使用render
之前的 DOM 狀態(tài)componentDidUpdate(prevProps, prevState)
props
變化重新獲取數(shù)據(jù)componentWillUnmount()
: 做些資源釋放,卸載副作用的事情詳細(xì)內(nèi)容請(qǐng)參考React 知識(shí)體系之生命周期及使用場(chǎng)景[3]
state
用于組件內(nèi)部數(shù)據(jù)傳遞,state
數(shù)據(jù)可以通過this.setSate
或者useState
進(jìn)行修改
props
用于組件外部組件數(shù)據(jù)傳遞,props
不能直接修改.主要使用場(chǎng)景是:
"爺孫組件"
組件通信props
的使用范圍雖然更加廣泛,但也有其局限性:對(duì)于嵌套層次較深的組件,如果使用props
傳遞數(shù)據(jù),會(huì)導(dǎo)致代碼冗余,增加數(shù)據(jù)傳遞的復(fù)雜度
在 JavaScript 中,super 指的是父類構(gòu)造函數(shù)。(在我們的示例中,它指向 React.Component 實(shí)現(xiàn)。)
在調(diào)用父類的構(gòu)造函數(shù)之前,你是不能在 constructor
中使用 this
關(guān)鍵字的。JavaScript 不允許這個(gè)行為
class Checkbox extends React.Component {
constructor(props) {
//
關(guān)鍵字: react
文章連接: http://www.hsjyfc.com.cn/cjwt/821.html
版權(quán)聲明:文章由 晨展科技 整理收集,來源于互聯(lián)網(wǎng)或者用戶投稿,如有侵權(quán),請(qǐng)聯(lián)系我們,我們會(huì)立即刪除。如轉(zhuǎn)載請(qǐng)保留
晨展解決方案
晨展新聞