react取消捕獲_React學習筆記(三)

090df553ed73016dcd5ce036f60e56fd.png

React學習筆記(三),組件的生命周期

React中組件也有生命周期,也就是說也有很多鉤子函數供我們使用, 組件的生命周期,我們會分為四個階段,初始化、運行中、銷毀、錯誤處理(16.3之后)

初始化

在組件初始化階段會執行

00001. constructor

00002. static getDerivedStateFromProps()

00003. componentWillMount() / UNSAFE_componentWillMount()

00004. render()

00005. componentDidMount()

更新階段

props或state的改變可能會引起組件的更新,組件重新渲染的過程中會調用以下方法:

00001. componentWillReceiveProps() / UNSAFE_componentWillReceiveProps()

00002. static getDerivedStateFromProps()

00003. shouldComponentUpdate()

00004. componentWillUpdate() / UNSAFE_componentWillUpdate()

00005. render()

00006. getSnapshotBeforeUpdate()

00007. componentDidUpdate()

卸載階段

00001. componentWillUnmount()

錯誤處理

00001. componentDidCatch()

各生命周期詳解

1.constructor(props)

React組件的構造函數在掛載之前被調用。在實現React.Component構造函數時,需要先在添加其他內容前,調用super(props),用來將父組件傳來的props綁定到這個類中,使用this.props將會得到。

官方建議不要在constructor引入任何具有副作用和訂閱功能的代碼,這些應當使用componentDidMount()。

constructor中應當做些初始化的動作,如:初始化state,將事件處理函數綁定到類實例上,但也不要使用setState()。如果沒有必要初始化state或綁定方法,則不需要構造constructor,或者把這個組件換成純函數寫法。

當然也可以利用props初始化state,在之后修改state不會對props造成任何修改,但仍然建議大家提升狀態到父組件中,或使用redux統一進行狀態管理。

constructor(props) {

super(props);

this.state = {

isLiked: props.isLiked

};}

2.static getDerivedStateFromProps(nextProps, prevState)

getDerivedStateFromProps 是react16.3之后新增,在組件實例化后,和接受新的props后被調用。他必須返回一個對象來更新狀態,或者返回null表示新的props不需要任何state的更新。

如果是由于父組件的props更改,所帶來的重新渲染,也會觸發此方法。

調用steState()不會觸發getDerivedStateFromProps()。

之前這里都是使用constructor+componentWillRecieveProps完成相同的功能的

3. componentWillMount() / UNSAFE_componentWillMount()

componentWillMount()將在React未來版本(官方說法 17.0)中被棄用。UNSAFE_componentWillMount()在組件掛載前被調用,在這個方法中調用setState()不會起作用,是由于他在render()前被調用。

為了避免副作用和其他的訂閱,官方都建議使用componentDidMount()代替。這個方法是用于在服務器渲染上的唯一方法。這個方法因為是在渲染之前被調用,也是惟一一個可以直接同步修改state的地方。

4.render()

render()方法是必需的。當他被調用時,他將計算this.props和this.state,并返回以下一種類型:

00001. React元素。通過jsx創建,既可以是dom元素,也可以是用戶自定義的組件。

00002. 字符串或數字。他們將會以文本節點形式渲染到dom中。

00003. Portals。react 16版本中提出的新的解決方案,可以使組件脫離父組件層級直接掛載在DOM樹的任何位置。

00004. null,什么也不渲染

00005. 布爾值。也是什么都不渲染。

當返回null,false,ReactDOM.findDOMNode(this)將會返回null,什么都不會渲染。

render()方法必須是一個純函數,他不應該改變state,也不能直接和瀏覽器進行交互,應該將事件放在其他生命周期函數中。 如果shouldComponentUpdate()返回false,render()不會被調用。

5. componentDidMount

componentDidMount在組件被裝配后立即調用。初始化使得DOM節點應該進行到這里。

通常在這里進行ajax請求

如果要初始化第三方的dom庫,也在這里進行初始化。只有到這里才能獲取到真實的dom.

6.componentWillReceiveProps()/UNSAFE_componentWillReceiveProps(nextProps)

官方建議使用getDerivedStateFromProps函數代替componentWillReceiveProps。當組件掛載后,接收到新的props后會被調用。如果需要更新state來響應props的更改,則可以進行this.props和nextProps的比較,并在此方法中使用this.setState()。

如果父組件會讓這個組件重新渲染,即使props沒有改變,也會調用這個方法。

React不會在組件初始化props時調用這個方法。調用this.setState也不會觸發。

7.shouldComponentUpdate(nextProps, nextState)

調用shouldComponentUpdate使React知道,組件的輸出是否受state和props的影響。默認每個狀態的更改都會重新渲染,大多數情況下應該保持這個默認行為。

在渲染新的props或state前,shouldComponentUpdate會被調用。默認為true。這個方法不會在初始化時被調用,也不會在forceUpdate()時被調用。返回false不會阻止子組件在state更改時重新渲染。

如果shouldComponentUpdate()返回false,componentWillUpdate,render和componentDidUpdate不會被調用。

官方并不建議在shouldComponentUpdate()中進行深度查詢或使用JSON.stringify(),他效率非常低,并且損傷性能。

8.UNSAFE_componentWillUpdate(nextProps, nextState)

在渲染新的state或props時,UNSAFE_componentWillUpdate會被調用,將此作為在更新發生之前進行準備的機會。這個方法不會在初始化時被調用。

不能在這里使用this.setState(),也不能做會觸發視圖更新的操作。如果需要更新state或props,調用getDerivedStateFromProps。

9.getSnapshotBeforeUpdate()

在react render()后的輸出被渲染到DOM之前被調用。它使您的組件能夠在它們被潛在更改之前捕獲當前值(如滾動位置)。這個生命周期返回的任何值都將作為參數傳遞給componentDidUpdate()。

10.componentDidUpdate(prevProps, prevState, snapshot)

在更新發生后立即調用componentDidUpdate()。此方法不用于初始渲染。當組件更新時,將此作為一個機會來操作DOM。只要您將當前的props與以前的props進行比較(例如,如果props沒有改變,則可能不需要網絡請求),這也是做網絡請求的好地方。

如果組件實現getSnapshotBeforeUpdate()生命周期,則它返回的值將作為第三個“快照”參數傳遞給componentDidUpdate()。否則,這個參數是undefined。

11.componentWillUnmount()

在組件被卸載并銷毀之前立即被調用。在此方法中執行任何必要的清理,例如使定時器無效,取消網絡請求或清理在componentDidMount中創建的任何監聽。

12.componentDidCatch(error, info)

錯誤邊界是React組件,可以在其子組件樹中的任何位置捕獲JavaScript錯誤,記錄這些錯誤并顯示回退UI,而不是崩潰的組件樹。錯誤邊界在渲染期間,生命周期方法以及整個樹下的構造函數中捕獲錯誤。

如果類組件定義了此生命周期方法,則它將成錯誤邊界。在它中調用setState()可以讓你在下面的樹中捕獲未處理的JavaScript錯誤,并顯示一個后備UI。只能使用錯誤邊界從意外異常中恢復; 不要試圖將它們用于控制流程。

錯誤邊界只會捕獲樹中下面組件中的錯誤。錯誤邊界本身不能捕獲錯誤。

PureComponent

PureComponnet里如果接收到的新屬性或者是更改后的狀態和原屬性、原狀態相同的話,就不會去重新render了 在里面也可以使用shouldComponentUpdate,而且。是否重新渲染以shouldComponentUpdate的返回值為最終的決定因素。

import React, { PureComponent } from 'react'

?

class YourComponent extends PureComponent {

……

}

ref

React提供的這個ref屬性,表示為對組件真正實例的引用,其實就是ReactDOM.render()返回的組件實例,ref可以掛載到組件上也可以是dom元素上。

· 掛到組件(class聲明的組件)上的ref表示對組件實例的引用。不能在函數式組件上使用 ref 屬性,因為它們沒有實例:

· 掛載到dom元素上時表示具體的dom元素節點。

在React 最新的版本中,要使用ref, 需要使用React.createRef方法先生成一個ref。

import React, { Component, createRef } from 'react'import ReactDOM from 'react-dom'?class App extends Component {

constructor() {

super()

// 創建inputRef this.inputRef=createRef()

}

componentDidMount () {

console.log(this.inputRef.current) // <input type="text"> }

render () {

return (

<div>

{/* 關聯ref和dom */}

<input type="text" ref={this.inputRef} />

</div>

)

}}ReactDOM.render(

<App/>,

document.getElementById('root'))

React Hooks

React Hooks 是 React 16.7.0-alpha 版本推出的新特性, 有了React Hooks,在 react 函數組件中,也可以使用類組件(classes components)的 state 和 組件生命周期。通過下面幾個例子來學習React Hooks。

· State Hook

// useState是react包提供的一個方法import React, { useState } from "react";import ReactDOM from "react-dom";?const Counter = () => {

// useState 這個方法可以為我們的函數組件擁有自己的state,它接收一個用于初始 state 的值,返回一對變量。這里我們把計數器的初始值設置為0, 方法都是以set開始 const [count, setCount] = useState(0);

return (

<div>

<p>你點擊了{count}次</p>

<button onClick={() => setCount(count + 1)}>點擊</button>

</div>

);};?const rootElement = document.getElementById("root");?ReactDOM.render(<Counter />, rootElement);

· Effect Hook

// useState是react包提供的一個方法import React, { useState, useEffect } from "react";import ReactDOM from "react-dom";?const Counter = () => {

// useState 這個方法可以為我們的函數組件擁有自己的state,它接收一個用于初始 state 的值,返回一對變量。這里我們把計數器的初始值設置為0, 方法都是以set開始 const [count, setCount] = useState(0);

// 類似于componentDidMount或者componentDidUpdate: useEffect(() => {

// 更改網頁的標題,還可以做其它的監聽 document.title = `你點擊了${count}次`;

});

return (

<div>

<p>你點擊了{count}次</p>

<button onClick={() => setCount(count + 1)}>點擊</button>

</div>

);};?const rootElement = document.getElementById("root");?ReactDOM.render(<Counter />, rootElement);

· React Hooks 的規則

· 只能在頂層調用Hooks。不要在循環,條件或嵌套函數中調用Hook。

· 不要從常規JavaScript函數中調用Hook。只在React函數式組件調用Hooks。

· 自定義hooks可以選擇講解

· react 內置hooks api

· Basic Hooks

· useState

· useEffect

· useContext

· Additional Hooks

· useReducer

· useCallback

· useMemo

· useRef

· useImperativeHandle

· useLayoutEffect

· useDebugValue

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530628.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

zzulioj1111: 多個整數的逆序輸出(函數專題)

1111: 多個整數的逆序輸出&#xff08;函數專題&#xff09;時間限制: 1 Sec 內存限制: 128 MB 提交: 3521 解決: 2617 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入n和n個整數&#xff0c;以與輸入順序相反的順序輸出這n個整數。要求不使用數組&#xff0c;而使用遞歸…

快捷鍵_AutoCAD 2021中的默認快捷鍵、新建或編輯快捷鍵

文&#xff1a;CAD鐘日銘。歡迎關注和點贊支持。在使用AutoCAD進行制圖的過程中&#xff0c;掌握一些快捷鍵會提高操作效率。所謂的快捷鍵是指用于啟動命令的鍵組合。例如&#xff0c;按CtrlN組合鍵(快捷鍵)新建圖形文件&#xff0c;按 CtrlO組合鍵可打開圖形文件&#xff0c;按…

1112: 進制轉換(函數專題)

1112: 進制轉換&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 3448 解決: 2599 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入一個十進制整數n&#xff0c;輸出對應的二進制整數。常用的轉換方法為“除2取余&#xff0c;倒序排列”。將一個…

出現畫面抖動_連續抖動20小時!虎門大橋橋面如波浪翻滾,專家:個人感覺沒問題...

前兩天(5月5日)&#xff0c;虎門大橋橋面出現如波浪翻滾的起伏&#xff0c;引發廣泛的關注&#xff1a;次日&#xff0c;廣東交通集團通報&#xff0c;虎門大橋震動是渦振現象&#xff0c;懸索橋結構安全。專家初步判斷此次渦振和橋上設置水馬有關。但直到6日早上11時&#xff…

1098: 復合函數求值(函數專題)

1098: 復合函數求值&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 5545 解決: 4335 [提交] [狀態] [討論版] [命題人:admin] 題目描述 求復合函數F(G(x))&#xff0c;其中函數F(x)|x-3||x1|&#xff0c;函數G(x)x^2-3x。要求編寫函數funF()和funG(…

安全模式 提權_記一次滲透挖洞提權實戰

摘要&#xff1a;這是一次挖掘cms通用漏洞時發現的網站&#xff0c;技術含量雖然不是很高&#xff0c;但是也拿出來和大家分享一下吧&#xff0c;希望能給一部分人帶來收獲。0x01 進入后臺在通過googlehack語法挖掘beescms時發現了這個站點利用網上的payload&#xff0c;在/mx_…

win7無法連接打印機拒絕訪問_“Windows無法連接打印機,操作失敗,錯誤為0x000003e3”...

請求大家幫助&#xff0c;昨天在共享打印機時出現“Windows無法連接打印機&#xff0c;操作失敗&#xff0c;錯誤為0x000003e3”。在百度百科查詢的資料修改了都不行(在不重裝系統前提下&#xff0c;聯想臺式機都是win732位系統)&#xff0c;給大家一一列舉&#xff0c;請求廣大…

1108: 打印數字圖形(函數專題)

1108: 打印數字圖形&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 4040 解決: 2786 [提交] [狀態] [討論版] [命題人:admin] 題目描述 從鍵盤輸入一個整數n(1≤n≤9),打印出指定的數字圖形。要求在程序中定義并調用如下函數&#xff1a;PrintSpace…

類型全部為string_python小講堂丨學了這么久的,這6種基本數據類型你真的理解了嗎...

哈嘍&#xff0c;大家好&#xff0c;歡迎來到python小講堂&#xff0c;間歇性的努力&#xff0c;會導致持續性的一事無成&#xff0c;即使今天是除夕&#xff0c;我們也不能懈怠啊&#xff0c;今天我給大家帶來的是關于python的6種基本數據類型的深入講解&#xff0c;話不多說讓…

1105: 判斷友好數對(函數專題)

1105: 判斷友好數對&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 5790 解決: 2629 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入兩個正整數m和n&#xff0c;順序輸出m到n之間的所有友好數對。 如果兩個整數的所有正因子之和&#xff08;…

防抖 節流_【前端面試】節流與防抖

我們用兩張圖表示什么是節流和防抖。防抖節流由圖可見&#xff0c;防抖的意思是&#xff0c;當用戶在一段時間內連續頻繁的試圖執行一個函數的時候&#xff0c;只有最后一次&#xff0c;函數被真正的執行。節流的意思是&#xff0c;當用戶在某一個時刻執行了一次函數的時候&…

沒數據時y軸不顯示_Matplotlib數據可視化

1.Matplotlib介紹什么是MatplotlibMatplotlib是一個Python的繪圖庫&#xff0c;它可與 NumPy 一起使用&#xff0c;可以代替MMatplotlib安裝由于Matplotlib是第三方庫&#xff0c;所以我們需要安裝它才可以使用。注意&#xff0c;Matplotlib3.0要求python3版本才可安裝使用。安…

1099: 角谷猜想(多實例測試)

1099: 角谷猜想&#xff08;多實例測試&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 5930 解決: 3888 [提交] [狀態] [討論版] [命題人:admin] 題目描述 任何一個自然數&#xff0c;如果是偶數&#xff0c;就除以2&#xff0c;如果是奇數&#xff0c;就乘以3再加1。最…

python軟件運行界面_python運行界面 python的圖形用戶界面怎么運行

為什么用Python開發界面應用程序1)wxWidgets是一個比MFC優雅的庫&#xff0c;TortoiseCVS用wxWidges而不用MFC&#xff0c;就是因為wxWidgets好用&#xff0c;而不是為了可以移植。 2)Python的面向對象腳本語言編程適合快速界面開發 3)Python在服務器端和客戶端都非常有前途&am…

1100: 求組合數(函數專題)

1100: 求組合數&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 6264 解決: 4653 [提交] [狀態] [討論版] [命題人:admin] 題目描述 馬上要舉辦新生程序設計競賽了&#xff0c;與以往不同的是&#xff0c;本次比賽以班為單位&#xff0c;為了全面衡量…

python畫圖隱藏畫筆_python畫圖

轉至&#xff1a;https://blog.csdn.net/weixin_43943977/article/details/1026913921、灰色櫻花樹from turtle import *from random import *from math import *def tree(n,l):pd()#下筆#陰影效果t cos(radians(heading()45))/80.25pencolor(t,t,t)pensize(n/3)forward(l)#畫…

1101: 逆序數字(函數專題)

1101: 逆序數字&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 6333 解決: 4717 [提交] [狀態] [討論版] [命題人:admin] 題目描述 輸入一個正整數n&#xff0c;計算n的逆序數m&#xff0c;輸出m與n的和。要求程序定義一個inverse()函數和一個main(…

循環劃線_經濟內外雙循環下的思考!

原創&#xff1a;群贏說到這個內外雙循環&#xff0c;我們汽車后市場朋友們&#xff0c;應該知道車子發動機水冷系統就是一個雙循環&#xff0c;內部小循環&#xff0c;外部大循環。在發動機溫度不高的時候&#xff0c;水在做小循環&#xff0c;在發動機周邊流動。當發動機溫度…

1103: 平均學分績點(函數專題)

1103: 平均學分績點&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 5386 解決: 2917 [提交] [狀態] [討論版] [命題人:admin] 題目描述 平均學分績點&#xff08;Grade Point Average&#xff0c;即GPA&#xff09;是以學分與績點作為衡量學生學習的…

1102: 火車票退票費計算(函數專題)

1102: 火車票退票費計算&#xff08;函數專題&#xff09; 時間限制: 1 Sec 內存限制: 128 MB 提交: 5055 解決: 3204 [提交] [狀態] [討論版] [命題人:admin] 題目描述 2013年起&#xff0c;火車票退票費比例下調&#xff1a;票面乘車站開車時間前48小時以上的按票價5%計退票費…