0x000 概述
上一章說(shuō)明了生命周期的概念,本質(zhì)上就是框架在操作組件的過(guò)程中暴露出來(lái)的一系列鉤子,我們可以選擇我們需要的鉤子,完成我們自己的業(yè)務(wù),以下講的是react v16.3以下的生命周期,v16.3以及以上的版本有所不同
0x001 組件掛載以下是組件掛載的過(guò)程中觸發(fā)的聲明周期:
class App extends React.Component { constructor(props) { super(props) console.log("constructor", props) } componentWillMount() { console.log("componentWillMount") } componentDidMount() { console.log("componentDidMount") } render() { console.log("render") return0x002 組件更新{Date()}
} componentDidMount() { console.log("componentDidMount") } }
以下是組件更新的時(shí)候觸發(fā)的生命周期:
class App extends React.Component { constructor() { super() this.state = { date: Date() } setTimeout(() => { this.setState({date: Date()}) }, 3000) } componentWillReceiveProps() { console.log("componentWillReceiveProps") } shouldComponentUpdate() { console.log("shouldComponentUpdate") return true } render() { console.log("render") return{this.state.date}
} componentWillUpdate() { console.log("componentWillUpdate") } componentDidUpdate() { console.log("componentDidUpdate") } }
第一次的render是由組件掛載引起的,而其他的方法則是由setState引起的
以下是由組件卸載的時(shí)候觸發(fā)的生命周期:
class Content extends React.Component { render(){ console.log("Content::render") return0x004 完整生命周期content
} componentWillUnmount() { console.log("Content::componentWillUnmount") } } class App extends React.Component { constructor() { super() this.state = { show: true } setTimeout(() => { this.setState({show: false}) }, 3000) } render() { console.log("App::render") return ( this.state.show ?: null ) } }
掛載: constructor componentWillMount render componentDidMount 更新: componentWillReceiveProps shouldComponentUpdate componentWillUpdate render componentDidUpdate 卸載: componentWillUnmount 錯(cuò)誤處理(這里不說(shuō)): componentDidCatch0x005 聲明周期使用場(chǎng)景
constructor(props):
該方法主要用來(lái)初始化state,或者初始化一些資源,可以訪問(wèn)prop,但是訪問(wèn)不了 setState,會(huì)報(bào)錯(cuò):Warning: Can"t call setState on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to this.state directly or define a state = {}; class property with the desired state in the App component.
class App extends React.Component { constructor() { super() this.state = { show: true } } render() { return ( this.state.show ?: null ) } }
componentWillMount()
沒(méi)啥卵用,可以在這個(gè)方法中調(diào)用setState(),并且設(shè)置的state可以在本次渲染生效,推薦使用constructor
render()
你懂的,每次更新?tīng)顟B(tài)都會(huì)觸發(fā),但是不要在這里調(diào)用會(huì)觸發(fā)組件更新的函數(shù),比如setState(),否則可能陷入無(wú)盡阿鼻地獄。
componentDidMount()
這個(gè)方法常用,觸發(fā)這個(gè)生命周期,意味著dom和子組件都掛載好了,refs也可以用了,一般在這兒做網(wǎng)絡(luò)請(qǐng)求。
componentWillReceiveProps(nextProps)
這個(gè)組件也常用,一般用于父組件狀態(tài)更新,導(dǎo)致傳遞給子組件的props更新,當(dāng)時(shí)子組件又不是直接綁定父組件的props的時(shí)候使用,比如
class Content extends React.Component { constructor(props) { super(props) this.state = { content: props.content } } render() { return this.state.content } } class App extends React.Component { constructor() { super() this.state = { content: "1" } setTimeout(() => { this.setState({ content: 10 }) }, 1000) } render() { return () } }
我們接受父組件的state.content作為子組件的初始化state.content,但是1s 之后,父組件發(fā)生了變化,state.content從1變成了10,我們期望子組件也同時(shí)更新,可惜子組件的constructor只會(huì)執(zhí)行一次,為了解決這個(gè)問(wèn)題,我們可以添加這個(gè)生命周期:
class Content extends React.Component { constructor(props) { super(props) this.state = { content: props.content } } componentWillReceiveProps(nextProps) { this.setState({ content:nextProps.content }) } render() { return this.state.content } }
這樣就可已在父組件props更新的時(shí)候,觸發(fā)子組件的更新
shouldComponentUpdate(nextProps, nextState)
這個(gè)組件也很常用,用來(lái)判斷是否要進(jìn)行某次更新,如果返回true則執(zhí)行更新,如果返回false則不更新,常用與性能優(yōu)化
class A extends React.Component { render() { console.log("A::render") return "A" } } class B extends React.Component { render() { console.log("B::render") return "A" } } class App extends React.Component { constructor(props) { super(props) this.state = { num: 1 } setTimeout(() => { this.setState({ num: 10, name: 1 }) }) } render() { console.log("App::render") return } } ReactDom.render(, document.getElementById("app") )
我們?cè)?b>App組件中掛載了A、B組件,App綁定了state.num,A、B綁定了state.name,然后在1s 后觸發(fā)app組件的更新,此時(shí)查看瀏覽器,可以看到,APP、A、B都執(zhí)行了render,但其實(shí)A、B依賴的name并沒(méi)有發(fā)生改變。如果是小組件還好,但如果是大組件,那就糟糕了,所以需要避免這種無(wú)所謂的更新:
class A extends React.Component { shouldComponentUpdate(nextProps, nextState) { return nextProps.name === this.props.name ? true : false } render() { console.log("A::render") return "A" } } class B extends React.Component { shouldComponentUpdate(nextProps, nextState) { return nextProps.name === this.props.name ? false : true } render() { console.log("B::render") return "A" } }
我在促發(fā)這個(gè)方法的時(shí)候,A組件返回 true,B 組件返回false,查看瀏覽器,可以發(fā)現(xiàn),觸發(fā)該方法的時(shí)候 A渲染了,而B沒(méi)有渲染
componentWillUpdate(nextProps, nextState)
沒(méi)啥卵用,和componentDidUpdate組成一對(duì)兒,如果業(yè)務(wù)需要,就用
componentDidUpdate()
沒(méi)啥卵用,和componentWillUpdate組成一對(duì)兒,如果業(yè)務(wù)需要,就用
componentWillUnmount
用于清理資源或者事件
class Content extends React.Component { constructor() { super() this.state = { num: 1 } setInterval(() => { this.setState({ num: ++this.state.num }) console.log(this.state.num) }, 1000) } render() { return this.state.num } } class App extends React.Component { constructor() { super() this.state = { show: true } setTimeout(() => { this.setState({ show: false }) },2000) } render() { return this.state.show ?: null } } ReactDom .render( , document .getElementById( "app" ) )
我們?cè)?b>App組件中掛載Content組件,而Content組件則使用定時(shí)器每秒更新一次,但是在2s 之后,我們?cè)?b>App組件中卸載這個(gè)組件,但是,查看瀏覽器可以發(fā)現(xiàn),定時(shí)器依舊在工作,并且報(bào)錯(cuò):
如果我們返回顯示隱藏組件,就會(huì)積累越來(lái)越多的定時(shí)器。然后就爆炸了。 ``` class Content extends React.Component { constructor() { super() this.state = { num: 1 } this.interval=setInterval(() => { this.setState({ num: ++this.state.num }) console.log(this.state.num) }, 1000) } render() { return this.state.num } componentWillUnmount(){ clearInterval(this.interval) } } ``` 這么解決0x006 總結(jié)
在不同的生命周期做不同的事。
0x007 資源:react
源碼
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97082.html
摘要:概述上一章只是稍微了解了一下和相關(guān)的簡(jiǎn)單用法,這一章需要講一下組件的生命周期。生命周期的概念這玩意似乎很高大上,其實(shí)就是一個(gè)假概念罷了,直接來(lái)實(shí)現(xiàn)一個(gè)類似的吧。 0x000 概述 上一章只是稍微了解了一下state和setState相關(guān)的簡(jiǎn)單用法,這一章需要講一下組件的生命周期。 0x001 生命周期的概念 這玩意似乎很高大上,其實(shí)就是一個(gè)假概念罷了,直接來(lái)實(shí)現(xiàn)一個(gè)類似的吧。大凡事物從...
摘要:的全稱是統(tǒng)一資源定位符英文,可以這么說(shuō),是一種標(biāo)準(zhǔn),而網(wǎng)址則是符合標(biāo)準(zhǔn)的一種實(shí)現(xiàn)而已。渲染器,將組件渲染到頁(yè)面上。 0x000 概述 從這一章開(kāi)始就進(jìn)入路由章節(jié)了,并不直接從如何使用react-route來(lái)講,而是從路由的概念和實(shí)現(xiàn)來(lái)講,達(dá)到知道路由的本質(zhì),而不是只知道如何使用react-route庫(kù)的目的,畢竟react-route只是一個(gè)庫(kù),是路由的一個(gè)實(shí)現(xiàn)而已,而不是路由本身。 ...
摘要:考慮到是快速入門,于是乎我們就記住一點(diǎn),當(dāng)修改值需要重新渲染的時(shí)候,的機(jī)制是不會(huì)讓他全部重新渲染的,它只會(huì)把你修改值所在的重新更新。這一生命周期返回的任何值將會(huì)作為參數(shù)被傳遞給。 安裝react npm install creat-react-app -gshowImg(https://segmentfault.com/img/remote/1460000015639868); 這里直...
摘要:生命周期在版本中引入了機(jī)制。以后生命周期圖解不包含官方不建議使用的事件處理事件的命名采用小駝峰式,而不是純小寫。只是在兄弟節(jié)點(diǎn)之間必須唯一受控組件使的成為唯一數(shù)據(jù)源。 react 基礎(chǔ) JSX JSX是一個(gè) JavaScript 的語(yǔ)法擴(kuò)展,可以很好地描述 UI 應(yīng)該呈現(xiàn)出它應(yīng)有交互的本質(zhì)形式。 React DOM 在渲染所有輸入內(nèi)容之前,默認(rèn)會(huì)進(jìn)行轉(zhuǎn)義。它可以確保在你的應(yīng)用中,永遠(yuǎn)...
摘要:概述不到必要不要在中訪問(wèn),嘗試使用的思想去解決問(wèn)題。當(dāng)然,必要的時(shí)候還是可以的,比如某些依賴的組件時(shí)機(jī)在中,并不是任何時(shí)候都可以訪問(wèn)的,需要講究時(shí)機(jī)。 0x000 概述 不到必要不要在React中訪問(wèn)Dom,嘗試使用React的思想去解決問(wèn)題。當(dāng)然,必要的時(shí)候還是可以的,比如某些依賴Dom的組件 0x001 時(shí)機(jī) 在React中,并不是任何時(shí)候都可以訪問(wèn)Dom的,需要講究時(shí)機(jī)。因?yàn)镽e...
閱讀 1084·2021-11-25 09:43
閱讀 706·2021-11-22 14:45
閱讀 3833·2021-09-30 09:48
閱讀 1072·2021-08-31 09:41
閱讀 1979·2019-08-30 13:52
閱讀 1986·2019-08-30 11:24
閱讀 1354·2019-08-30 11:07
閱讀 962·2019-08-29 12:15