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

資訊專欄INFORMATION COLUMN

【全棧React】第7天: 生命周期鉤子函數(shù)

Joyven / 636人閱讀

摘要:本文轉(zhuǎn)載自眾成翻譯譯者鏈接原文今天,我們將看看我們可以用于組件的一些最常見的生命周期鉤子函數(shù),我們將討論為什么它們是有用的,什么時(shí)間應(yīng)該用什么。我們使用的一個(gè)更常見的生命周期鉤子是鉤子。這些是我們可以在框架中進(jìn)行交互的一些生命周期鉤子。

本文轉(zhuǎn)載自:眾成翻譯
譯者:iOSDevLog
鏈接:http://www.zcfy.cc/article/3827
原文:https://www.fullstackreact.com/30-days-of-react/day-7/

今天,我們將看看我們可以用于React組件的一些最常見的生命周期鉤子函數(shù),我們將討論為什么它們是有用的,什么時(shí)間應(yīng)該用什么。

恭喜!我們已經(jīng)在React的第一周結(jié)束了,我們已經(jīng)覆蓋了這么多的基礎(chǔ)知識。我們剛剛完成了處理有狀態(tài)的組件來跟蹤組件的內(nèi)部狀態(tài)。今天,我們將暫停實(shí)施,并談一下應(yīng)用中的組件_lives_。也就是說,我們將討論組件的生命周期。

由于React裝載了我們的應(yīng)用,它為我們提供了一些鉤子,我們可以在組件生命周期的不同時(shí)間插入自己的功能。為了_hook into_到生命周期,我們需要在我們的組件上定義函數(shù),每個(gè)鉤子在適當(dāng)?shù)臅r(shí)候?qū)ζ溥M(jìn)行調(diào)用。讓我們來看看第一個(gè)生命周期鉤子:

componentWillMount() / componentDidMount()

當(dāng)我們的應(yīng)用中的一個(gè)頁面上定義了一個(gè)組件時(shí),在定義虛擬節(jié)點(diǎn)時(shí),我們不能立即依賴它在DOM中可用。相反,我們必須等到組件本身在瀏覽器中實(shí)際上是_mounted_。對于我們需要運(yùn)行的功能,我們可以定義兩個(gè)不同的_hooks_(或函數(shù))。在組件被裝載在頁面之前被調(diào)用的一個(gè),在組件被裝載之后被調(diào)用的一個(gè)。

什么是 mounting?

由于我們使用React定義了我們的DOM樹中的節(jié)點(diǎn)的virtual representation,我們實(shí)際上并沒有定義DOM節(jié)點(diǎn)。相反,我們正在建立一個(gè)內(nèi)存視圖,React為我們維護(hù)和管理。當(dāng)我們談?wù)搈ounting時(shí),我們談?wù)摰氖菍⑻摂M組件轉(zhuǎn)換為由React放置在DOM中的實(shí)際DOM元素的過程。

這對于諸如獲取數(shù)據(jù)來填充組件的事情非常有用。例如,假設(shè)我們想使用我們的活動(dòng)跟蹤器來顯示github事件。只有當(dāng)數(shù)據(jù)本身被渲染時(shí),我們才想加載這些事件。

回想一下我們在我們的活動(dòng)列表中定義了我們的Content 組件

class Content extends React.Component {
  render() {
    const {activities} = this.props; // ES6 destructuring

    return (
      
{/* Timeline item */} {activities.map((activity) => ( ))}
) } }

讓我們更新Content 組件,向github.com events api發(fā)出請求,并使用響應(yīng)來顯示活動(dòng)。 因此,我們需要更新對象的state

就像我們昨天做的那樣,我們通過在構(gòu)造函數(shù)中將this.state 設(shè)置為一個(gè)對象來更新我們的組件為狀態(tài)

class Content extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      activities: []
    }
  }

  // ...
}

現(xiàn)在,當(dāng)組件本身準(zhǔn)備裝載(或裝載之后)時(shí),我們將要發(fā)出一個(gè)HTTP請求。通過在我們的組件中定義函數(shù)componentWillMount() (或componentDidMount()),React將在DOM中裝載該方法之前運(yùn)行該方法。 這是我們添加 GET 請求的完美的地方。

讓我們更新content組件,并請求github api。 由于我們只想顯示一個(gè)小列表,我們來看最新的四個(gè)活動(dòng)。

我們已經(jīng)存儲了一個(gè)github數(shù)據(jù)的靜態(tài)JSON文件,我們將直接從源碼(我們將在幾天內(nèi)使用AJAX請求)使用promises。 現(xiàn)在,讓我們重點(diǎn)介紹如何使用新的數(shù)據(jù)實(shí)現(xiàn)更新組件:

class Content extends React.Component {
  // ...
  componentWillMount() {
    this.setState({activities: data});
  }
  // ...
}

請注意,我們沒有從我們的Content 組件更改任何內(nèi)容,它正常工作了。

componentWillUpdate() / componentDidUpdate()

有時(shí)我們會(huì)在更改實(shí)際呈現(xiàn)之前或之后更新我們組件的一些數(shù)據(jù)。 例如,假設(shè)當(dāng)組件的屬性更改時(shí),我們要調(diào)用一個(gè)函數(shù)來設(shè)置渲染或調(diào)用一個(gè)函數(shù)集。 componentWillUpdate() 方法是一個(gè)合理的鉤子來處理我們的組件進(jìn)行更改(只要我們不調(diào)用this.setState() 來處理它,因?yàn)樗鼤?huì)導(dǎo)致無限循環(huán))。

由于我們真的不需要深入處理這個(gè)問題,所以我們不用擔(dān)心在這里設(shè)置一個(gè)例子,但是很高興知道它存在。 我們使用的一個(gè)更常見的生命周期鉤子是componentWillReceiveProps() 鉤子。

componentWillReceiveProps()

當(dāng)組件即將接收新的props時(shí),React會(huì)調(diào)用一個(gè)方法。 這是當(dāng)組件將要接收一組新的屬性時(shí)將被調(diào)用的第一種方法。 定義這種方法是尋找特定props 更新的好時(shí)機(jī),因?yàn)樗刮覀冇袡C(jī)會(huì)計(jì)算更改并更新組件的內(nèi)部狀態(tài)。

這時(shí)我們可以根據(jù)新屬性更新我們的狀態(tài)。

這里要注意的一點(diǎn)是,即使componentWillReceiveProps() 方法被調(diào)用,props 的值可能沒有更改。 總是 檢查prop值的變化是一個(gè)好主意。

例如,讓我們添加一個(gè)_刷新_按鈕到我們的活動(dòng)列表,以便我們的用戶可以請求重新請求github事件api。

我們將使用componentWillReceiveProps() 鉤子來要求組件重新加載它的數(shù)據(jù)。 由于我們的組件是有狀態(tài)的,我們將要使用新數(shù)據(jù)刷新此狀態(tài),因此我們不能簡單地更新組件中的props 。 我們可以使用componentWillReceiveProps() 方法來_告訴_我們要刷新的組件。

我們在我們的包含元素上添加一個(gè)按鈕,該元素傳遞一個(gè)requestRefresh布爾屬性來告訴Content組件刷新。

class Container extends React.Component {
  constructor(props) {
    super(props);

    this.state = {refreshing: false}
  }

  // Bound to the refresh button
  refresh() {
    this.setState({refreshing: true})
  }

  // Callback from the `Content` component
  onComponentRefresh() {
    this.setState({refreshing: false});
  }

  render() {
    const {refreshing} = this.state;
    return (
      
{/* refreshing is the component"s state */} {/* A container for styling */}
) } }

請注意,我們有一個(gè)新元素顯示元素的子元素。 這是一種允許我們圍繞一些內(nèi)容添加CSS類的模式。

class Footer extends React.Component {
  render() {
    return (
      
{this.props.children}
) } }

使用這個(gè)新的proprequestRefresh prop),當(dāng)我們的state對象改變值時(shí),我們可以更新activities

class Content extends React.Component {
  // ...
  componentWillReceiveProps(nextProps) {
    // Check to see if the requestRefresh prop has changed
    if (nextProps.requestRefresh !== this.props.requestRefresh) {
      this.setState({loading: true}, this.updateData);
    }
  }
  // ...
}

此演示使用JSON文件中的靜態(tài)數(shù)據(jù),并在刷新時(shí)隨機(jī)挑選四個(gè)元素。 這被設(shè)置為simulate刷新。

componentWillUnmount()

在組件卸載之前,React將調(diào)用componentWillUnmount() 回調(diào)。 這是處理我們可能需要的任何清理事件的時(shí)候,例如清除超時(shí),清除數(shù)據(jù),斷開Websockets等。

例如,我們上次工作使用我們的時(shí)鐘組件,我們設(shè)置一個(gè)超時(shí)時(shí)間被稱為每秒鐘。 當(dāng)組件準(zhǔn)備卸載時(shí),我們希望確保我們清除此超時(shí),以便我們的JavaScript不會(huì)繼續(xù)為不存在的組件運(yùn)行超時(shí)。

回想一下,我們構(gòu)建的 timer 組件看起來像這樣:

import React from "react"

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = this.getTime();
  }

  componentDidMount() {
    this.setTimer();
  }

  setTimer() {
    this.timeout = setTimeout(this.updateClock.bind(this), 1000);
  }

  updateClock() {
    this.setState(this.getTime, this.setTimer);
  }

  getTime() {
    const currentTime = new Date();
    return {
      hours: currentTime.getHours(),
      minutes: currentTime.getMinutes(),
      seconds: currentTime.getSeconds(),
      ampm: currentTime.getHours() >= 12 ? "pm" : "am"
    }
  }

  // ...
  render() {

  }
}

export default Clock

當(dāng)我們的時(shí)鐘將被卸載時(shí),我們將要清除我們在組件的setTimer() 函數(shù)中創(chuàng)建的超時(shí)。 添加componentWillUnmount() 函數(shù)負(fù)責(zé)這個(gè)必要的清理。

class Clock extends React.Component {
  // ...
  componentWillUnmount() {
    if (this.timeout) {
      clearTimeout(this.timeout);
    }
  }
  // ...
}

這些是我們可以在React框架中進(jìn)行交互的一些生命周期鉤子。 當(dāng)我們構(gòu)建我們的應(yīng)用程序時(shí),我們將會(huì)很多地使用這些應(yīng)用,所以熟悉它們的方法是一個(gè)好主意,它們是如何存在,以及如何掛鉤組件的生命。

我們在這篇文章中介紹了一個(gè)新的概念,我們已經(jīng)看到了:我們在一個(gè)要從子組件調(diào)用到它的父組件上添加了一個(gè)回調(diào)。 在下一節(jié)中,我們將介紹如何定義和記錄組件的prop API,以便在整個(gè)團(tuán)隊(duì)和應(yīng)用中共享組件時(shí)使用。

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

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

相關(guān)文章

  • 全棧ReactReact 30教程索引

    摘要:今天我們將討論創(chuàng)建組件的最終方案,即無狀態(tài)函數(shù)的純組件。今天我們正在研究一種處理提出的復(fù)雜數(shù)據(jù)的方法,稱為體系結(jié)構(gòu)。第天部署介紹今天,我們將探討部署我們的應(yīng)用所涉及的不同部分,以便外界可以使用我們的應(yīng)用。 本文轉(zhuǎn)載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3758原文:https://www.fullstackreact.com/3...

    appetizerio 評論0 收藏0
  • 全棧React11: 純組件

    摘要:今天我們將討論創(chuàng)建組件的最終方案,即無狀態(tài)函數(shù)的純組件。為了獲得更多的性能和簡單性,同樣允許我們使用正常的函數(shù)創(chuàng)建純粹的,無狀態(tài)的組件。在中,功能組件被稱為一個(gè)參數(shù)的類似于構(gòu)造函數(shù)類,它們是它所調(diào)用的,以及組件樹的當(dāng)前。 本文轉(zhuǎn)載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3819原文:https://www.fullstackrea...

    Cciradih 評論0 收藏0
  • 全棧React6: 狀態(tài)

    摘要:無論何時(shí)狀態(tài)改變通過,組件將重新投遞。在調(diào)用函數(shù)之后,我們可以將第二個(gè)參數(shù)傳遞給函數(shù),該函數(shù)將在狀態(tài)更新后保證被調(diào)用。今天,我們更新了我們的組件以使其處于狀態(tài)狀態(tài),現(xiàn)在有必要處理如何使組件成為狀態(tài)。 本文轉(zhuǎn)載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3824原文:https://www.fullstackreact.com/30-d...

    leo108 評論0 收藏0
  • 前端面試題總結(jié)(js、html、小程序、React、ES6、Vue、算法、全棧熱門視頻資源)

    摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...

    pumpkin9 評論0 收藏0

發(fā)表評論

0條評論

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