国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

React生命周期-踩坑記_10

hiYoHoo / 1260人閱讀

摘要:代碼示意生命周期安裝在創(chuàng)建組件的實(shí)例并將其插入時(shí),將按以下順序調(diào)用這些方法組件的構(gòu)造函數(shù)在安裝之前被調(diào)用。否則,將在構(gòu)造函數(shù)中未定義,這可能導(dǎo)致錯(cuò)誤。錯(cuò)誤處理在渲染期間,生命周期方法或任何子組件的構(gòu)造函數(shù)中發(fā)生錯(cuò)誤時(shí),將調(diào)用這些方法。

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

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

Mounting:已插入真實(shí) DOM

Updating:正在被重新渲

Unmounting:已移出真實(shí) DOM

componentWillMount 在渲染前調(diào)用,在客戶端也在服務(wù)端。

生命周期介紹 componentDidMount :

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

componentWillReceiveProps

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

shouldComponentUpdate

返回一個(gè)布爾值。在組件接收到新的props或者state時(shí)被調(diào)用。在初始化時(shí)或者使用forceUpdate時(shí)不被調(diào)用。
可以在你確認(rèn)不需要更新組件時(shí)使用。

componentWillUpdate

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

componentDidUpdate

在組件完成更新后立即調(diào)用。在初始化時(shí)不會(huì)被調(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)建組件的實(shí)例并將其插入DOM時(shí),將按以下順序調(diào)用這些方法:

constructor()

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

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

通過(guò)分配對(duì)象來(lái)初始化本地狀態(tài)this.state。
將事件處理程序方法綁定到實(shí)例。
不應(yīng)該打電話setState()給constructor()。相反,如果您的組件需要使用本地狀態(tài),請(qǐng)直接在構(gòu)造函數(shù)中指定初始狀態(tài)this.state。

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

static getDerivedStateFromProps()

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

render()

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

調(diào)用時(shí),它應(yīng)檢查this.props并this.state返回以下類(lèi)型之一:

React elements。通常通過(guò)JSX創(chuàng)建。

Arrays and fragments。讓您從渲染中返回多個(gè)元素。有關(guān)更多詳細(xì)信息,請(qǐng)參閱片段文檔。

Portals。

字符串和數(shù)字。它們?cè)贒OM中呈現(xiàn)為文本節(jié)點(diǎn)。

布爾或null。什么都沒(méi)有。

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

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

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

componentDidMount()

componentDidMount()在安裝組件(插入樹(shù)中)后立即調(diào)用。需要DOM節(jié)點(diǎn)的初始化應(yīng)該放在這里。如果需要從遠(yuǎn)程端點(diǎn)加載數(shù)據(jù),這是實(shí)例化網(wǎng)絡(luò)請(qǐng)求的好地方。

此方法是設(shè)置任何訂閱的好地方。如果您這樣做,請(qǐng)不要忘記取消訂閱componentWillUnmount()。

您可以在componentDidMount()立即使用this.setState()。它將觸發(fā)額外的渲染,但它將在瀏覽器更新屏幕之前發(fā)生。這保證即使render()在這種情況下將被調(diào)用兩次,用戶也不會(huì)看到中間狀態(tài)。請(qǐng)謹(jǐn)慎使用此模式,因?yàn)樗ǔ?huì)導(dǎo)致性能問(wèn)題。在大多數(shù)情況下,您應(yīng)該能夠分配初始狀態(tài)constructor()。但是,當(dāng)您需要在渲染依賴于其大小或位置的東西之前測(cè)量DOM節(jié)點(diǎn)時(shí),可能需要對(duì)模態(tài)和工具提示等情況進(jìn)行處理。

這些方法被認(rèn)為是遺留的,應(yīng)該在新代碼中避免它們:

UNSAFE_componentWillMount()

更新

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

static getDerivedStateFromProps() render() getSnapshotBeforeUpdate()

getSnapshotBeforeUpdate(prevProps, prevState)

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

此用例并不常見(jiàn),但它可能出現(xiàn)在需要以特殊方式處理滾動(dòng)位置的聊天線程等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 (
      
{/* ...contents... */}
); } }
componentDidUpdate()

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

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

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

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

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

這些方法被認(rèn)為是遺留的,您應(yīng)該在新代碼中避免它們:

UNSAFE_componentWillUpdate()

UNSAFE_componentWillReceiveProps()

卸載

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

componentWillUnmount()

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

不應(yīng)該調(diào)用setState(),componentWillUnmount()因?yàn)榻M件永遠(yuǎn)不會(huì)被重新呈現(xiàn)。卸載組件實(shí)例后,將永遠(yuǎn)不會(huì)再次安裝它。

錯(cuò)誤處理

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

static getDerivedStateFromError()

static getDerivedStateFromError(error)

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

componentDidCatch()

componentDidCatch(error, info)

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

error - 拋出的錯(cuò)誤。
info- componentStack包含鍵的對(duì)象,其中包含有關(guān)哪個(gè)組件引發(fā)錯(cuò)誤的信息。

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

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

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 

Something went wrong.

; } return this.props.children; } }

http://projects.wojtekmaj.pl/...

https://reactjs.org/blog/2018...

https://reactjs.org/docs/reac...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99561.html

相關(guān)文章

  • React生命周期-坑記_10

    摘要:代碼示意生命周期安裝在創(chuàng)建組件的實(shí)例并將其插入時(shí),將按以下順序調(diào)用這些方法組件的構(gòu)造函數(shù)在安裝之前被調(diào)用。否則,將在構(gòu)造函數(shù)中未定義,這可能導(dǎo)致錯(cuò)誤。錯(cuò)誤處理在渲染期間,生命周期方法或任何子組件的構(gòu)造函數(shù)中發(fā)生錯(cuò)誤時(shí),將調(diào)用這些方法。 React生命周期 生命周期概覽 生命周期的狀態(tài) 組件的生命周期可分成三個(gè)狀態(tài): Mounting:已插入真實(shí) DOM Updating:正在被重新渲...

    ideaa 評(píng)論0 收藏0
  • 關(guān)于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

    sutaking 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<