摘要:之前后的生命周期初始化階段設(shè)置默認(rèn)屬性,設(shè)置屬性校驗(yàn)屬性檢查器,檢查父組件傳遞給當(dāng)前組件的類型設(shè)置組件的初始化狀態(tài)父組件掛載之前父組件掛載子組件掛載中父組件掛載完成組件被更新完成后觸發(fā)。
lefecycle-React
react16之前后的生命周期
A.初始化階段:
1.設(shè)置默認(rèn)屬性:
static defaultProps = { name: "sls", age:23, number: 0 }; //or Counter.defaltProps={name:"sls"}
2)設(shè)置屬性校驗(yàn)
`import PropTypes from "prop-types";` 屬性檢查器,檢查父組件傳遞給當(dāng)前組件的類型 static propTypes = { number: PropTypes.number.isRequired }
2.設(shè)置組件的初始化狀態(tài)
constructor() { super(); this.state = {number: 0} }
3、父組件掛載之前 componentWillMount
4 、render(父組件掛載)
5、子組件掛載中render
6、父組件掛載完成 componentDidMount
組件被更新完成后觸發(fā)。頁面中產(chǎn)生了新的DOM的元素,可以進(jìn)行DOM操作
7、父組件是否需要更新 shouldComponentUpdate
//上一個(gè)屬性對(duì)象 上一個(gè)狀態(tài)對(duì)象 shouldComponentUpdate(prevProps,prevState){ if(prevState.number<5){//如果新狀態(tài)的number屬性小于5的話 return true; }else{ return false; } }
8、父組件將要更新 componentWillUpdate
4、render(父組件掛載)
9、子組件將要接收到新屬性SubCounter componentWillReceiveProps
10、子組件是否需要更新 shouldComponentUpdate
shouldComponentUpdate(props,state){ if(props.number<3){ return true; }else{ return false; } }
11、子組件將要更新 componentWillUpdate
12、子組件掛載中render
13、子組件更新完成 componentDidUpdate
8、父組件更新完成 componentDidUpdate
子組件最后一次更新:
6、父組件是否需要更新 shouldComponentUpdate
7、父組件將要更新 componentWillUpdate
4、render(父組件掛載)
9、子組件將要接收到新屬性SubCounter componentWillReceiveProps
10、子組件是否需要更新 shouldComponentUpdate
8、父組件更新完成 componentDidUpdate
一般我們通過shouldComponentUpdate()函數(shù)來優(yōu)化性能:
一個(gè)React項(xiàng)目需要更新一個(gè)小組件時(shí),很可能需要父組件更新自己的狀態(tài)。而一個(gè)父組件的重新更新會(huì)造成它旗下所有的子組件重新執(zhí)行render()方法,形成新的虛擬DOM,再用diff算法對(duì)新舊虛擬DOM進(jìn)行結(jié)構(gòu)和屬性的比較,決定組件是否需要重新渲染
無疑這樣的操作會(huì)造成很多的性能浪費(fèi),所以我們開發(fā)者可以根據(jù)項(xiàng)目的業(yè)務(wù)邏輯,在shouldComponentUpdate()中加入條件判斷,從而優(yōu)化性能
例如React中的就提供了一個(gè)PureComponent的類,當(dāng)我們的組件繼承于它時(shí),組件更新時(shí)就會(huì)默認(rèn)先比較新舊屬性和狀態(tài),從而決定組件是否更新。值得注意的是,PureComponent進(jìn)行的是淺比較,所以組件狀態(tài)或?qū)傩愿淖儠r(shí),都需要返回一個(gè)新的對(duì)象或數(shù)組
import React from "react" import ReactDOM from "react-dom"; class SubCounter extends React.Component { componentWillReceiveProps() { console.log("9、子組件將要接收到新屬性SubCounter componentWillReceiveProps"); } shouldComponentUpdate(newProps, newState) { console.log("10、子組件是否需要更新 shouldComponentUpdate"); if (newProps.number < 5) return true; return false } componentWillUpdate() { console.log("11、子組件將要更新 componentWillUpdate"); } componentDidUpdate() { console.log("13、子組件更新完成 componentDidUpdate"); } componentWillUnmount() { console.log("14、子組件將卸載 componentWillUnmount"); } render() { console.log("12、子組件掛載中render"); return ({this.props.number}
) } } class Counter extends React.Component { static defaultProps = { //1、加載默認(rèn)屬性 name: "sls", age:23 }; constructor() { super(); //2、加載默認(rèn)狀態(tài) this.state = {number: 0} } componentWillMount() { console.log("3、父組件掛載之前 componentWillMount"); } componentDidMount() { console.log("5、父組件掛載完成 componentDidMount"); } shouldComponentUpdate(newProps, newState) { console.log("6、父組件是否需要更新 shouldComponentUpdate"); if (newState.number<15) return true; return false } componentWillUpdate() { console.log("7、父組件將要更新 componentWillUpdate"); } componentDidUpdate() { console.log("8、父組件更新完成 componentDidUpdate"); } handleClick = () => { this.setState({ number: this.state.number + 1 }) }; render() { console.log("4、render(父組件掛載)"); return () } } ReactDOM.render({this.state.number}
{this.state.number<10?:null} , document.getElementById("root"));
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/114501.html
摘要:的返回值將作為的參數(shù),如果返回,則不更新,不能返回或以外的值,否則會(huì)警告。在更新之前調(diào)用,此時(shí)已更新返回值作為的第個(gè)參數(shù)一般用于獲取之前的數(shù)據(jù)語法是從的返回值,默認(rèn)是的使用場(chǎng)景一般是獲取組建更新之前的滾動(dòng)條位置。 React16 后的各功能點(diǎn)是多個(gè)版本陸陸續(xù)續(xù)迭代增加的,本篇文章的講解是建立在 16.6.0 版本上本篇文章主旨在介紹 React16 之后版本中新增或修改的地方,所以對(duì)于...
摘要:卸載階段組件卸載和銷毀老版生命周期之前的生命周期初始化階段涉及個(gè)鉤子函數(shù)這些方法會(huì)在組件初始化的時(shí)候被調(diào)用,只跟實(shí)例的創(chuàng)建有關(guān)。 前言:React 的版本從 v15 到 v16.3 ,再到v16.4,現(xiàn)在最新的版本是 v16.8了。其中最大的變化可能是React Hooks的加入,而最令人困惑的卻是它的生命周期,新舊生命周期函數(shù)混雜在一起,難免會(huì)讓許多新來者有很多困惑。所以這一篇我們來...
摘要:本文主要介紹之后的生命周期。該方法有兩個(gè)參數(shù)和返回值為對(duì)象不需要返回整體,把需要改變的返回即可。必須有一個(gè)返回值,返回的數(shù)據(jù)類型可以有。此生命周期主要用于優(yōu)化性能。最后,說明一點(diǎn)這三個(gè)生命周期在未來版本中會(huì)被廢棄。 React16.3.0開始,生命周期進(jìn)行了一些變化。本文主要介紹React16.3.0之后的生命周期。 React16.3.0之前生命周期: 16版本之前的react組件的...
摘要:我們目前的計(jì)劃是為不安全生命周期引入別名,和。從現(xiàn)在開始,只有新的生命周期名稱將起作用。從版本開始,更新以響應(yīng)更改的推薦方法是使用新的靜態(tài)生命周期。 注釋:本文是根據(jù)React的官方博客翻譯而成(文章地址:https://reactjs.org/blog/2018...)。主要講述了React之后的更新方向,以及對(duì)之前生命周期所出現(xiàn)的問題的總結(jié),之后的React將逐步棄用一些生命周期和...
摘要:組件生命周期構(gòu)造方法是對(duì)類的默認(rèn)方法,通過命令生成對(duì)象實(shí)例時(shí)自動(dòng)調(diào)用該方法。該生命周期可以發(fā)起異步請(qǐng)求,并。后廢棄該生命周期,可以在中完成設(shè)置渲染組件是一個(gè)組件必須定義的生命周期,用來渲染。該生命周期內(nèi)可以進(jìn)行。 React組件生命周期 constructor( ) 構(gòu)造方法 constructor是ES6對(duì)類的默認(rèn)方法,通過 new 命令生成對(duì)象實(shí)例時(shí)自動(dòng)調(diào)用該方法。并且,該方法是...
摘要:因?yàn)榘姹緦⒄嬲龔U棄這三生命周期到目前為止,的渲染機(jī)制遵循同步渲染首次渲染,更新時(shí)更新時(shí)卸載時(shí)期間每個(gè)周期函數(shù)各司其職,輸入輸出都是可預(yù)測(cè),一路下來很順暢。通過進(jìn)一步觀察可以發(fā)現(xiàn),預(yù)廢棄的三個(gè)生命周期函數(shù)都發(fā)生在虛擬的構(gòu)建期間,也就是之前。 showImg(https://segmentfault.com/img/bVbweoj?w=559&h=300); 背景 前段時(shí)間準(zhǔn)備前端招聘事項(xiàng)...
閱讀 738·2021-10-09 09:44
閱讀 2005·2021-09-22 15:54
閱讀 5043·2021-09-22 10:55
閱讀 1435·2019-08-29 18:41
閱讀 771·2019-08-29 11:24
閱讀 2099·2019-08-28 18:20
閱讀 1024·2019-08-26 11:51
閱讀 3043·2019-08-26 11:00