最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解在React.js中使用PureComponent的重要性和使用方式

 更新時間:2018年07月10日 10:25:04   作者:Eason  
這篇文章主要介紹了詳解在React.js中使用PureComponent的重要性和使用方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、介紹PureComponent

React 15.3在2016.06.29發(fā)布了,這個版本最值得關注的是支持了 React.PureComponent ,它取代了之前的 pure-render-mixin 。在本文中,我們將討論 PureComponent 的重要性和使用場景。

React.PureComponent最重要的一個用處就是優(yōu)化React應用,這很容易快速地實現(xiàn)。使用 React.PureComponent 對性能的提升是非??捎^的,因為它減少了應用中的渲染次數(shù)。

PureComponent改變了生命周期方法 shouldComponentupdate ,并且它會自動檢查組件是否需要重新渲染。這時,只有PureComponent檢測到 state 或者 props 發(fā)生變化時,PureComponent才會調(diào)用 render 方法,因此,你不用手動寫額外的檢查,就可以在很多組件中改變 state , 例如:

if (this.state.someVal !== computedVal) {
 this.setState({ someVal: computedVal })
}

根據(jù)React源碼,如果組件是純組件(Pure Component),那么一下比較是很容易理解的:

if (this._compositeType === CompositeTypes.PureClass) {
 shouldUpdate = !shallowEqual(prevProps, nextProps) || ! shallowEqual(inst.state, nextState);
}

其中, shadowEqual 只會"淺"檢查組件的 props state ,這就意味著嵌套對象和數(shù)組是不會被比較的。

深比較操作是非常昂貴的,同時,如果這個組件還是純組件(PureComponent),那么深比較將會更浪費。另外,你也可以使用 shouldComponentUpdate 來手動確定組件是否需要重新渲染。最簡單的方式就是直接比較 props state :

shouldComponentUpdate(nextProps, nextState) {
 return nextProps.user.id === props.user.id;
}

除此之外,你可以使用 immutable 屬性。這種情況下,屬性的比較是非常容易的,因為已存在的對象不會發(fā)生改變,取而代之的是重新創(chuàng)建新的對象。其中, Immutable.js 就是非常好的Immutable庫。

二、使用PureComponent

PureComponent節(jié)約了我們的時間,避免了多余的代碼。那么,掌握如何正確使用它是非常重要的,否則如果使用不當,它就無法發(fā)揮作用。因為PureComponent僅僅是淺比較(shadow comparison),所以改變組件內(nèi)部的 props 或者 state ,它將不會發(fā)揮作用。例如,讓我們想想這樣一種情況,父組件有一個render方法和一個click處理方法:

handleClick() {
 let {items} = this.state

 items.push('new-item')
 this.setState({ items })
}

render() {
 return (
  <div>
   <button onClick={this.handleClick} />
   <ItemList items={this.state.items} />
  </div>
 )
}

如果ItemList是純組件(PureComponent),那么這時它是不會被渲染的,因為盡管 this.state.items 的值發(fā)生了改變,但是它仍然指向同一個對象的引用。但是,通過移除可變對象就很容易改變這種情況,使之能夠正確被渲染。

handleClick() {
 this.setState(prevState => ({
  words: prevState.items.concat(['new-item'])
 }));
}

如果一個純組件(PureComponent)的 state 或 props 引用了一個新對象,那么這個組件就會被重新渲染(re-render)。這暗示著,如果不想損失PureComponent的優(yōu)點,那么我們應該避免以下的結構:

<Entity values={this.props.values || []}/>

如上面代碼,新數(shù)組,即便是空數(shù)組,總是會迫使組件重新渲染。為了避免這個問題,你可以使用 defaultProps ,它包含了一個屬性的初始化空狀態(tài)。解決這個問題的另一種方法如下:

<CustomInput onChange={e => this.props.update(e.target.value)} />

在純組件(PureComponent)被創(chuàng)建時,因為函數(shù)的新對象被創(chuàng)建了,所以它會獲得新數(shù)據(jù),并且重新渲染。解決這個問題最簡單的方法就是: 在組件的 constructor 方法中使用 bind 。

constructor(props) {
  super(props)
  this.update = this.update.bind(this)
}
update(e) {
  this.props.update(e.target.value)
}
render() {
  return <MyInput onChange={this.update} />
}

同時,在JSX中,任何包含子元素(child elements)的組件, shallowEqual 檢查總會返回false。

請謹記:純組件忽略重新渲染時,不僅會影響它本身,而且會影響它的說有子元素,所以,使用PureComponent的最佳情況就是展示組件,它既沒有子組件,也沒有依賴應用的全局狀態(tài)。

三、總結

事實上,如果你已經(jīng)意識到 shallowEqual JS References 的特性,過渡到PureComponent是相當容易的。正常情況下,遷移的方式非常簡單,就像改變組件繼承的基類,從

class MyComponent extends Component {...}

class MyComponent extends PureComponent {...}

這樣不僅能平滑過渡,甚至可以提升性能。所以,我極力推薦所有人在開發(fā)應用中使用PureComponent。

四、注意

在純組件有子組件的時候,所有基于 this.context 改變的子組件,在 this.context 改變時, 將不會重新渲染 ,除非在父組件(Parent ParentComponent)中聲明 contextTypes 。

本文翻譯至habrahabr。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 淺談react 同構之樣式直出

    淺談react 同構之樣式直出

    這篇文章主要介紹了淺談react 同構之樣式直出,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • React路由鑒權的實現(xiàn)方法

    React路由鑒權的實現(xiàn)方法

    這篇文章主要介紹了React路由鑒權的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • React中的函數(shù)式插槽詳解

    React中的函數(shù)式插槽詳解

    這篇文章主要為大家詳細介紹了React?開發(fā)中遇到的具名插槽的函數(shù)用法,文中的示例代碼講解詳細,具有一定的學習價值,有興趣的小伙伴可以了解一下
    2023-11-11
  • React使用ref方法與場景介紹

    React使用ref方法與場景介紹

    這篇文章主要介紹了React使用ref方法與場景,React支持給任意組件添加特殊屬性。ref屬性接受一個回調(diào)函數(shù),它在組件被加載或卸載時會立即執(zhí)行
    2022-10-10
  • React中使用Axios進行HTTP請求

    React中使用Axios進行HTTP請求

    這篇文章主要為大家展示了如何在 React 中使用 Axios 進行 HTTP 請求,包括 GET 和 POST 請求的使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-11-11
  • mobx在react hooks中的應用方式

    mobx在react hooks中的應用方式

    這篇文章主要介紹了mobx在react hooks中的應用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • React?保留和重置State

    React?保留和重置State

    這篇文章主要為大家介紹了React?保留和重置State實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • React.memo 和 useMemo 的使用問題小結

    React.memo 和 useMemo 的使用問題小結

    隨著代碼的增加,每次的狀態(tài)改變,頁面進行一次 reRender ,這將產(chǎn)生很多不必要的 reRender 不僅浪費性能,從而導致頁面卡頓,這篇文章主要介紹了React.memo 和 useMemo 的使用問題小結,需要的朋友可以參考下
    2022-11-11
  • React實現(xiàn)預覽展示docx和Excel文件

    React實現(xiàn)預覽展示docx和Excel文件

    這篇文章主要為大家詳細介紹了如何使用React實現(xiàn)預覽展示docx和Excel文件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • React18新增特性released的使用

    React18新增特性released的使用

    本文主要介紹了React18新增特性released的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05

最新評論

施秉县| 柳州市| 家居| 辽源市| 沾化县| 武定县| 昭觉县| 灌南县| 嘉善县| 华宁县| 扶沟县| 兴和县| 福泉市| 虹口区| 桂平市| 大兴区| 普陀区| 东阳市| 枞阳县| 云安县| 维西| 陆良县| 宁波市| 渝北区| 宁德市| 贞丰县| 紫金县| 绥德县| 新乐市| 高平市| 崇礼县| 阿拉善右旗| 夹江县| 石泉县| 正阳县| 巨野县| 伊金霍洛旗| 弋阳县| 新疆| 咸阳市| 肥城市|