React 組件生命週期 - 加載組件

#JavaScript#Frontend
初探 React 組件生命週期

組件

React提供React.Component,我們可以透過使用組件,拆分 UI 為可以重複使用的獨立部分。React.Component是一個抽象的 base class。我們甚少直接運用React.Component,通常是透過創建一個子類,並使用render()方法。

例子:

class Greeting extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

如果你不選擇使用 ES6,你可以使用模組create-react-class。你可以參考React Without ES6。 下面這一段和 ES6 的寫法效果一樣:

var createReactClass = require("create-react-class");
var Greeting = createReactClass({
  render: function () {
    return <h1>Hello, {this.props.name}</h1>;
  },
});

組件生命週期

每一個組件都會有幾個生命週期的方法,你可以在程序運行的指定時間,透過覆蓋他們來運行特定代碼。對於這些方法,我們會用will-來表示它會在某些事情發生之前的一刻被調用,而did-則是表示它會在某些事情發生之後的一刻被調用。本文會細說加載組件中發生了什麼事情。

加載 (Mounting)

  1. constructor()
  2. componentWillMount()
  3. render()
  4. componentDidMount()

更新 (Updating)

當 props 或者 state 更新的時候,下面這些方法會被調用:

  1. componentWillReceiveProps()
  2. shouldComponentUpdate()
  3. componentWillUpdate()
  4. render()
  5. componentDidUpdate()

斷開連接 (Unmounting)

當組件脫離 DOM 的時候,下面這個方法回被調用:

  1. componentWillUnmount()

其他內置方法

  1. setState()
  2. forceUpdate()

我們會在下文討論一下 React 是如何加載組件。

{% img /img/react-mount.svg 300 auto React LifeCycle Mount %}

constructor()

constructor(props);

在 React 加載組件之前,它會調用constructor。你可以在constructor中去賦予組件的初始state。如果你使用props創造初始state的話,這也是可以接受的。這會很有效地fork組件的props,然後賦予初始state的值。

有效的constructor例子:

constructor(props) {
  super(props);
  this.state = {
    color: props.initialColor
  };
}
注意事項
  1. 如果你不需要賦予初始state,你不需要在 React 的組件中植入constructor
  2. 當你使用在React.Component的子類中加載constructor()方法時,你應該第一時間調用super(props),而不是在任何 statement 之後。不然,我們獲取this.props值的時候,它會是undefined
  3. 在一些類似上面的例子,state未必會及時與任何的props更新。如果你需要同步state的話,你其實是想要lift the state up

componentWillMount()

componentWillMount();

它會在組件render()之前執行一次,然後不能再執行。如果在這裡定義了setState方法,頁面只會在加載之前更新一次,不會重複渲染。React 官方推薦使用constructor()代替這個方法。

render()

React.Component必須有這個方法,即使你返回null,或者false。當你返回null,或者false的時候,ReactDOM.findDOMNode(this) 會返回null

當它被調用的時候,它會檢查this.propsthis.state,然後返回一個單獨的 React 元素。這個元素會是一個純正的DOM組件,例如

,或者自定義的 composite 組件。

注意事項
  1. render()方法應該是pure:它不會改寫任何組件的state。每一次調用它都會返回同樣的結果。它不會直接接觸到瀏覽器層面。
  2. 如果你需要接觸到瀏覽器層面,你應該在componentDidMount()或者其他生命週期方法中接觸瀏覽器。
  3. 保持render()方法 pure 來讓組件更加容易被人理解。

componentDidMount()

componentDidMount();

它會在組件加載之後執行一次。如果你的初始程序需要 DOM nodes,你應該在這裡寫。如果你需要從其他地方加載資料,這裡也是一個不錯的地方去執行網絡請求。如果在這裡定義了setState方法,會觸發重複渲染。

測試代碼

class Greeting extends React.Component {
  _log(method, args) {
    console.log(method, args);
  }

  constructor(props) {
    super(props);
    console.log("constructor", props);
  }

  render() {
    this._log("render", this.props.name);
    return <h1>Hello, {this.props.name}</h1>;
  }

  componentWillMount() {
    this._log("componentWillMount");
  }

  componentDidMount() {
    this._log("componentDidMount");
  }
}

ReactDOM.render(<Greeting name="Calpa" />, document.getElementById("app"));

Console Output:

"constructor" Object {
  name: "Calpa"
}
"componentWillMount" undefined
"render" "Calpa"
"componentDidMount" undefined

你可以在CodePen中獲取,並測試這段代碼。

不知道拿哪一張當封面好。。。

關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。

熱門文章

最新文章

圖片管理中心
管理圖片資源
IP 查詢
快速查詢和定位 IP 地址的地理位置和相關信息
Python 運行器
無需後端、無需登入,只需打開瀏覽器即可運行 Python 代碼(由 Pyodide 提供支持)
封面圖生成器
自動創建適合各種平台的文章封面圖
原作(青山剛昌)產生器
一鍵創建原作(青山剛昌)的封面圖
日本色彩
探索和使用傳統日本色彩
部落格內容洞察儀表板
以視覺化儀表板方式追蹤文章成效、分享熱度與分類分布,協助創作者掌握內容表現。
蒙特卡羅估算 π
使用蒙特卡羅方法演示 π 值的估算過程
LLM
使用 LLM 模型進行聊天
活動圖生成器
一鍵創建活動的封面圖
Wagmi Card
一鍵創建 Wagmi 的封面圖
Facebook Quote
Facebook Quote
Music Macro Language (MML) Studio
用程式語法編寫旋律,用音符構築想像
Blurhash
一鍵創建 Blurhash
文字分類器
使用 MediaPipe TextClassifier 分類文字
前端工程師免費工具資源
前端工程師免費工具資源
後端工程師免費工具資源
後端工程師免費工具資源
全端工程師免費工具資源
全端工程師免費工具資源
Web3 工程師免費工具資源
Web3 工程師免費工具資源
紫微斗數排盤系統|結合 AI 的命盤性格與事業財務分析生成器
紫微斗數排盤工具,輸入生日與時辰,自動生成完整命盤分析提示(Prompt)。結合最專業紫微理論與 AI 助力,助你深入解析性格、事業、財務與人際課題。免費使用,適合命理師及紫微愛好者。
PixAI Prompt 組合器|快速打造可用於 AI 繪圖的語言拼圖
使用 PixAI 卻不會寫 prompt?這個工具幫你一鍵組裝角色、表情、風格語彙,輸出高品質繪圖提示語句(Prompt),可直接貼入 PixAI 使用。適合插畫師、創作者、AI 新手與 VTuber 角色開發者。