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

React生命周期原理與用法踩坑筆記

 更新時間:2020年04月28日 09:38:49   作者:xiaoping  
這篇文章主要介紹了React生命周期原理與用法,結(jié)合實例形式總結(jié)分析了react生命周期原理、用法及相關(guān)注意事項,需要的朋友可以參考下

本文實例講述了React生命周期原理與用法。分享給大家供大家參考,具體如下:

React生命周期

生命周期概覽

生命周期的狀態(tài)

組件的生命周期可分成三個狀態(tài):

  • Mounting:已插入真實 DOM
  • Updating:正在被重新渲
  • Unmounting:已移出真實 DOM
  • componentWillMount 在渲染前調(diào)用,在客戶端也在服務端。

生命周期介紹

componentDidMount :

在第一次渲染后調(diào)用,只在客戶端。之后組件已經(jīng)生成了對應的DOM結(jié)構(gòu),可以通過this.getDOMNode()來進行訪問。 如果你想和其他JavaScript框架一起使用,可以在這個方法中調(diào)用setTimeout, setInterval或者發(fā)送AJAX請求等操作(防止異步操作阻塞UI)。

componentWillReceiveProps

在組件接收到一個新的 prop (更新后)時被調(diào)用。這個方法在初始化render時不會被調(diào)用。

shouldComponentUpdate

返回一個布爾值。在組件接收到新的props或者state時被調(diào)用。在初始化時或者使用forceUpdate時不被調(diào)用。

可以在你確認不需要更新組件時使用。

componentWillUpdate

在組件接收到新的props或者state但還沒有render時被調(diào)用。在初始化時不會被調(diào)用。

componentDidUpdate

在組件完成更新后立即調(diào)用。在初始化時不會被調(diào)用。

componentWillUnmount

在組件從 DOM 中移除之前立刻被調(diào)用。

代碼示意

class Content extends React.Component {
 componentWillMount() {
   console.log('Component WILL MOUNT!')
 }
 componentDidMount() {
    console.log('Component DID MOUNT!')
 }
 componentWillReceiveProps(newProps) {
    console.log('Component WILL RECEIVE PROPS!')
 }
 shouldComponentUpdate(newProps, newState) {
    return true;
 }
 componentWillUpdate(nextProps, nextState) {
    console.log('Component WILL UPDATE!');
 }
 componentDidUpdate(prevProps, prevState) {
    console.log('Component DID UPDATE!')
 }
 componentWillUnmount() {
     console.log('Component WILL UNMOUNT!')
 }
 

React16.3生命周期

安裝

在創(chuàng)建組件的實例并將其插入DOM時,將按以下順序調(diào)用這些方法:

constructor()

React組件的構(gòu)造函數(shù)在安裝之前被調(diào)用。在實現(xiàn)React.Component子類的構(gòu)造函數(shù)時,應該super(props)在任何其他語句之前調(diào)用。否則,this.props將在構(gòu)造函數(shù)中未定義,這可能導致錯誤。

通常,在React中,構(gòu)造函數(shù)僅用于兩個目的:

通過分配對象來初始化本地狀態(tài)this.state。

將事件處理程序方法綁定到實例。

不應該打電話setState()給constructor()。相反,如果您的組件需要使用本地狀態(tài),請直接在構(gòu)造函數(shù)中指定初始狀態(tài)this.state。

構(gòu)造函數(shù)是his.state直接分配的唯一位置。在所有其他方法中,需要使用this.setState()。

static getDerivedStateFromProps()

getDerivedStateFromProps在調(diào)用render方法之前調(diào)用,無論是在初始安裝還是后續(xù)更新。它應該返回一個更新狀態(tài)的對象,或者返回null以不更新任何狀態(tài)。

render()

render()方法是類組件中唯一必需的方法。

調(diào)用時,它應檢查this.props并this.state返回以下類型之一:

  • React elements。通常通過JSX創(chuàng)建。
  • Arrays and fragments。讓您從渲染中返回多個元素。有關(guān)更多詳細信息,請參閱片段文檔。
  • Portals。
  • 字符串和數(shù)字。它們在DOM中呈現(xiàn)為文本節(jié)點。
  • 布爾或null。什么都沒有。

該render()函數(shù)應該無狀態(tài)的,這意味著它不會修改組件狀態(tài),每次調(diào)用時都返回相同的結(jié)果,并且它不直接與瀏覽器交互。

如果您需要與瀏覽器進行交互,請執(zhí)行componentDidMount()或其他生命周期方法。保持render()純粹使組件更容易思考。

如果shouldComponentUpdate()返回false,則render()不會被調(diào)用

componentDidMount()

  • componentDidMount()在安裝組件(插入樹中)后立即調(diào)用。需要DOM節(jié)點的初始化應該放在這里。如果需要從遠程端點加載數(shù)據(jù),這是實例化網(wǎng)絡(luò)請求的好地方。
  • 此方法是設(shè)置任何訂閱的好地方。如果您這樣做,請不要忘記取消訂閱componentWillUnmount()。
  • 您可以在componentDidMount()立即使用this.setState()。它將觸發(fā)額外的渲染,但它將在瀏覽器更新屏幕之前發(fā)生。這保證即使render()在這種情況下將被調(diào)用兩次,用戶也不會看到中間狀態(tài)。請謹慎使用此模式,因為它通常會導致性能問題。在大多數(shù)情況下,您應該能夠分配初始狀態(tài)constructor()。但是,當您需要在渲染依賴于其大小或位置的東西之前測量DOM節(jié)點時,可能需要對模態(tài)和工具提示等情況進行處理。

這些方法被認為是遺留的,應該在新代碼中避免它們:

UNSAFE_componentWillMount()

更新

props or state 的更改可能導致更新。重新渲染組件時,將按以下順序調(diào)用這些方法:

static getDerivedStateFromProps()
render()
getSnapshotBeforeUpdate()
getSnapshotBeforeUpdate(prevProps, prevState)

getSnapshotBeforeUpdate()在最近呈現(xiàn)的輸出被提交到例如DOM之前調(diào)用。它使得組件可以在可能更改之前從DOM捕獲一些信息(例如滾動位置)。此生命周期返回的任何值都將作為參數(shù)傳遞給componentDidUpdate()。

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

官網(wǎng)的例子

class ScrollingList extends React.Component {
 constructor(props) {
  super(props);
  this.listRef = React.createRef();
 }

 getSnapshotBeforeUpdate(prevProps, prevState) {
  // Are we adding new items to the list?
  // Capture the scroll position so we can adjust scroll later.
  if (prevProps.list.length < this.props.list.length) {
   const list = this.listRef.current;
   return list.scrollHeight - list.scrollTop;
  }
  return null;
 }

 componentDidUpdate(prevProps, prevState, snapshot) {
  // If we have a snapshot value, we've just added new items.
  // Adjust scroll so these new items don't push the old ones out of view.
  // (snapshot here is the value returned from getSnapshotBeforeUpdate)
  if (snapshot !== null) {
   const list = this.listRef.current;
   list.scrollTop = list.scrollHeight - snapshot;
  }
 }

 render() {
  return (
   <div ref={this.listRef}>{/* ...contents... */}</div>
  );
 }
}

componentDidUpdate()

componentDidUpdate()更新發(fā)生后立即調(diào)用。初始渲染不會調(diào)用此方法。

將此作為在更新組件時對DOM進行操作的機會。只要您將當前道具與之前的道具進行比較(例如,如果道具未更改,則可能不需要網(wǎng)絡(luò)請求),這也是進行網(wǎng)絡(luò)請求的好地方。

componentDidUpdate(prevProps) {
 // Typical usage (don't forget to compare props):
 if (this.props.userID !== prevProps.userID) {
  this.fetchData(this.props.userID);
 }
}

componentDidUpdate()但要注意,必須在一個條件下被包裹就像上面的例子中,否則會導致無限循環(huán)。它還會導致額外的重新渲染,雖然用戶不可見,但會影響組件性能。

componentDidUpdate():如果shouldComponentUpdate()返回false,則不會被調(diào)用。

這些方法被認為是遺留的,您應該在新代碼中避免它們:

UNSAFE_componentWillUpdate()

UNSAFE_componentWillReceiveProps()

卸載

從DOM中刪除組件時調(diào)用此方法:

componentWillUnmount()

componentWillUnmount()在卸載和銷毀組件之前立即調(diào)用。在此方法中執(zhí)行任何必要的清理,例如使計時器無效,取消網(wǎng)絡(luò)請求或清除在其中創(chuàng)建的任何訂閱componentDidMount()。

不應該調(diào)用setState(),componentWillUnmount()因為組件永遠不會被重新呈現(xiàn)。卸載組件實例后,將永遠不會再次安裝它。

錯誤處理

在渲染期間,生命周期方法或任何子組件的構(gòu)造函數(shù)中發(fā)生錯誤時,將調(diào)用這些方法。

static getDerivedStateFromError()

static getDerivedStateFromError(error)

在后代組件拋出錯誤后調(diào)用此生命周期。它接收作為參數(shù)拋出的錯誤,并應返回值以更新狀態(tài)。

componentDidCatch()

componentDidCatch(error, info)

在后代組件拋出錯誤后調(diào)用此生命周期。它接收兩個參數(shù):

error - 拋出的錯誤。

info- componentStack包含鍵的對象,其中包含有關(guān)哪個組件引發(fā)錯誤的信息。

如果發(fā)生錯誤,可以componentDidCatch()通過調(diào)用呈現(xiàn)回退UI setState,但在將來的版本中將不推薦使用。使用static getDerivedStateFromError()處理回退,而不是渲染。

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

class ErrorBoundary extends React.Component {
 constructor(props) {
  super(props);
  this.state = { hasError: false };
 }

 static getDerivedStateFromError(error) {
  // Update state so the next render will show the fallback UI.
  return { hasError: true };
 }

 componentDidCatch(error, info) {
  // Example "componentStack":
  //  in ComponentThatThrows (created by App)
  //  in ErrorBoundary (created by App)
  //  in div (created by App)
  //  in App
  logComponentStackToMyService(info.componentStack);
 }

 render() {
  if (this.state.hasError) {
   // You can render any custom fallback UI
   return <h1>Something went wrong.</h1>;
  }
  return this.props.children; 
 }
}

希望本文所述對大家react程序設(shè)計有所幫助。

相關(guān)文章

  • React 狀態(tài)的不變性實例詳解

    React 狀態(tài)的不變性實例詳解

    這篇文章主要為大家介紹了React 狀態(tài)的不變性實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • React中使用UMEditor的方法示例

    React中使用UMEditor的方法示例

    這篇文章主要介紹了React中使用UMEditor的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • React useEffect、useLayoutEffect底層機制及區(qū)別介紹

    React useEffect、useLayoutEffect底層機制及區(qū)別介紹

    useEffect 是 React 中的一個 Hook,允許你在函數(shù)組件中執(zhí)行副作用操作,本文給大家介紹React useEffect、useLayoutEffect底層機制及區(qū)別介紹,感興趣的朋友一起看看吧
    2025-04-04
  • React實現(xiàn)虛擬滾動的三種思路詳解

    React實現(xiàn)虛擬滾動的三種思路詳解

    在??web??開發(fā)的過程中,或多或少都會遇到大列表渲染的場景,為了解決大列表造成的渲染壓力,便出現(xiàn)了虛擬滾動技術(shù),本文主要介紹虛擬滾動的三種思路,希望對大家有所幫助
    2024-04-04
  • React useImperativeHandle處理組件狀態(tài)和生命周期用法詳解

    React useImperativeHandle處理組件狀態(tài)和生命周期用法詳解

    React Hooks 為我們提供了一種全新的方式來處理組件的狀態(tài)和生命周期,useImperativeHandle是一個相對較少被提及的Hook,但在某些場景下,它是非常有用的,本文將深討useImperativeHandle的用法,并通過實例來加深理解
    2023-09-09
  • 實例講解React 組件

    實例講解React 組件

    這篇文章主要介紹了React 組件的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • 用React實現(xiàn)一個簡單的虛擬列表

    用React實現(xiàn)一個簡單的虛擬列表

    虛擬列表是現(xiàn)在比較常用的前端渲染大數(shù)據(jù)列表的方案,目前也有很多組件庫和工具庫也都有對應的實現(xiàn),本文將給大家介紹一下如何用React實現(xiàn)一個簡單的虛擬列表,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 基于Node的React圖片上傳組件實現(xiàn)實例代碼

    基于Node的React圖片上傳組件實現(xiàn)實例代碼

    本篇文章主要介紹了基于Node的React圖片上傳組件實現(xiàn)實例代碼,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • React報錯之Parameter event implicitly has an any type解決

    React報錯之Parameter event implicitly has a

    這篇文章主要為大家介紹了React報錯之Parameter event implicitly has an any type,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • React Native全面屏狀態(tài)欄和底部導航欄適配教程詳細講解

    React Native全面屏狀態(tài)欄和底部導航欄適配教程詳細講解

    最近在寫 React Native 項目,調(diào)試應用時發(fā)現(xiàn)頂部狀態(tài)欄和底部全面屏手勢指示條區(qū)域不是透明的,看起來很難受。研究了一下這個問題,現(xiàn)在總結(jié)一下解決方案,這篇文章主要介紹了React Native全面屏狀態(tài)欄和底部導航欄適配教程
    2023-01-01

最新評論

鄂伦春自治旗| 雷山县| 新化县| 醴陵市| 饶平县| 宜黄县| 奎屯市| 揭东县| 镇雄县| 定结县| 招远市| 新田县| 区。| 五原县| 龙泉市| 鄱阳县| 松滋市| 云和县| 新竹市| 茶陵县| 安陆市| 虞城县| 龙山县| 勃利县| 阿克苏市| 临江市| 锦屏县| 南昌县| 施甸县| 九台市| 武陟县| 新丰县| 五常市| 惠水县| 屏东市| 察隅县| 吕梁市| 麻栗坡县| 精河县| 永康市| 通化县|