React?Hooks--useEffect代替常用生命周期函數(shù)方式
useEffect代替常用生命周期函數(shù)
原始生命周期函數(shù)
componentDidMount
componentDidUpdate
componentWillUnmount
采用原始的方式把計(jì)數(shù)器的Demo增加兩個(gè)生命周期函數(shù)componentDidMount和componentDidUpdate。
分別在組件第一次渲染后在瀏覽器控制臺(tái)打印出計(jì)數(shù)器結(jié)果和在每次計(jì)數(shù)器狀態(tài)發(fā)生變化后打印出結(jié)果。
代碼如下:
import React, { Component } from 'react'; class Example3 extends Component { constructor(props) { super(props); this.state = { count:0 } } componentDidMount(){ console.log(`ComponentDidMount=>You clicked ${this.state.count} times`) } componentDidUpdate(){ console.log(`componentDidUpdate=>You clicked ${this.state.count} times`) } render() { return ( <div> <p>You clicked {this.state.count} times</p> <button onClick={this.addCount.bind(this)}>Chlick me</button> </div> ); } addCount(){ this.setState({count:this.state.count+1}) } } export default Example3;
React首次渲染和之后的每次渲染都會(huì)調(diào)用一遍useEffect函數(shù),而之前我們要用兩個(gè)生命周期函數(shù)分別表示首次渲染(componentDidMonut)和更新導(dǎo)致的重新渲染(componentDidUpdate)。
組件中經(jīng)常用到componentWillUnmount生命周期函數(shù)(組件將要被卸載時(shí)執(zhí)行)。比如我們的定時(shí)器要清空,避免發(fā)生內(nèi)存泄漏;比如登錄狀態(tài)要取消掉,避免下次進(jìn)入信息出錯(cuò)。
app.js
import React, { useState , useEffect } from 'react'; import { BrowserRouter as Router, Route, Link } from "react-router-dom" function Index() { useEffect(()=>{ console.log('useEffect=>老弟你來(lái)了!Index頁(yè)面') return ()=>{ console.log('老弟,你走了!Index頁(yè)面') } },[]) return <h2>JSPang.com</h2>; } function List() { useEffect(()=>{ console.log('useEffect=>老弟,你來(lái)了!List頁(yè)面') return ()=>{ console.log('老弟,你走了!List頁(yè)面') } }) return <h2>List-Page</h2>; } function App(){ const [ count , setCount ] = useState(0); useEffect(()=>{ console.log(`useEffect=>You clicked ${count} times`) return ()=>{ console.log('====================') } },[count]) return ( <div> <p>You clicked {count} times</p> <button onClick={()=>{setCount(count+1)}}>click me</button> <Router> <ul> <li> <Link to="/">首頁(yè)</Link> </li> <li><Link to="/list/">列表</Link> </li> </ul> <Route path="/" exact component={Index} /> <Route path="/list/" component={List} /> </Router> </div> ) } export default App;
index.js
import React from "react"; import {render} from "react-dom" import App from "./components/app" import {BrowserRouter} from "react-router-dom"; //渲染組件,我們使用react-router組件渲染組件時(shí)需要使用路由器組件標(biāo)簽,我們可以使用"<BrowserRouter>"或者是"<HashRouter>"。但需要注意喲,這是一個(gè)SPA應(yīng)用喲~ render( ( <BrowserRouter> <App /> </BrowserRouter> ), document.getElementById("root") )
PS:
useEffect的第二個(gè)參數(shù):
實(shí)現(xiàn)類似componentWillUnmount的效果,它是一個(gè)數(shù)組,數(shù)組中可以寫入很多狀態(tài)對(duì)應(yīng)的變量,意思是當(dāng)狀態(tài)值發(fā)生變化時(shí),我們才進(jìn)行解綁。
如果我們想每次count發(fā)生變化,我們都進(jìn)行解綁,只需要在第二個(gè)參數(shù)的數(shù)組里加入count變量就可以了但是當(dāng)傳空數(shù)組[]時(shí),就是當(dāng)組件將被銷毀時(shí)才進(jìn)行解綁,這也就實(shí)現(xiàn)了componentWillUnmount的生命周期函數(shù)。
對(duì)React Hooks(useState和useEffect) 的總結(jié)思考
一、為什么用React Hooks(面向生命周期編程變成了面向業(yè)務(wù)邏輯編程)
Hooks是React16.8版本后新增加的特性,目的是讓你用函數(shù)組件的寫法代替原來(lái)的類組件寫法,同時(shí)讓函數(shù)組件支持state,同時(shí)用useEffect代替原來(lái)的生命周期的業(yè)務(wù)功能編寫代碼
風(fēng)格,目的就是解決原來(lái)用class寫組件的痛點(diǎn),痛點(diǎn)有哪些自行查閱資料,主要有:
(1)選擇性煩惱:是使用狀態(tài)組件還是無(wú)狀態(tài)組件? 擁有了hooks后,現(xiàn)在一切組件均是Function。
(2)搞不清生命周期的鉤子函數(shù)? 擁有了hooks后,生命周期鉤子函數(shù)可以先丟一邊了。
(3)組件的this搞暈了?擁有了hooks后,不需面對(duì)this.
二、useState理解
1.useState是異步的,定義方法(語(yǔ)法叫數(shù)組解構(gòu)寫法),例如:
// 聲明一個(gè)叫 “count” 的 state 變量? ?const [count, setCount] = useState(0); // 更新state <button onClick={() => setCount(count + 1)}> ? ? Click me ? </button>
2. state變量可以定義多個(gè),也可以存儲(chǔ)對(duì)象和數(shù)組,這邊有一個(gè)規(guī)則:它總是替換它,而不象class一樣合并它,即有閉包的概念。
三、useEffect的理解(原則:讓你忘記類組件的生命周期的函數(shù)寫法)
useEffect出現(xiàn)的需求背景:我們只想在 React 更新 DOM 之后運(yùn)行一些額外的代碼 (所以叫副作用函數(shù))
(一) 它是一個(gè)鉤子函數(shù)的定義,即對(duì)于dom的渲染后會(huì)產(chǎn)生相應(yīng)的副作用(這個(gè)副作用中定義相關(guān)的功能),達(dá)于原來(lái)類組件的對(duì)生命周期函數(shù)一樣的應(yīng)用效果,但比它更靈活省事。
(二)定義一個(gè)useEffect主要分為四種定義方法(總結(jié):需不要return,需不要第二個(gè)參數(shù),第二個(gè)參數(shù)要不要[]):
- 1.每次渲染都要執(zhí)行:則第二個(gè)參數(shù)不需要。
- 2.在組件銷毀或者調(diào)用函數(shù)前調(diào)用。: 則第一個(gè)參數(shù)中增加return語(yǔ)句。
- 3.只在組件掛載時(shí)執(zhí)行一次:則第二個(gè)參數(shù)用空數(shù)組:[].
- 4.只在某一個(gè)state或者prop值發(fā)生變化后,才執(zhí)行,則第二個(gè)參數(shù)[變量名]。
(三)useEffect可以定義多個(gè),把功能實(shí)現(xiàn)進(jìn)行分離。
(四)useEffect 使用規(guī)則:
- 1.只在最頂層使用 Hook
- 2.只在 React 函數(shù)中調(diào)用 Hook
四、useState和useEffect聲明時(shí)有先后順序
產(chǎn)生的結(jié)果是不一樣,所以根據(jù)業(yè)務(wù)需要靈活確定他們先后順序的組合。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
React實(shí)現(xiàn)菜單欄滾動(dòng)功能
本文將會(huì)基于react實(shí)現(xiàn)滾動(dòng)菜單欄功能,點(diǎn)擊菜單,內(nèi)容區(qū)域會(huì)自動(dòng)滾動(dòng)到對(duì)應(yīng)卡片,內(nèi)容區(qū)域滑動(dòng),指定菜單欄會(huì)被選中,代碼簡(jiǎn)單易懂,感興趣的朋友一起看看吧2024-03-03React內(nèi)部實(shí)現(xiàn)cache方法示例詳解
這篇文章主要為大家介紹了React內(nèi)部實(shí)現(xiàn)cache方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11React中路由參數(shù)如何改變頁(yè)面不刷新數(shù)據(jù)的情況
這篇文章主要介紹了React中路由參數(shù)如何改變頁(yè)面不刷新數(shù)據(jù)的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08React Router中Link和NavLink的學(xué)習(xí)心得總結(jié)
這篇文章主要介紹了React Router中Link和NavLink的學(xué)習(xí)心得總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12React Native 搭建開發(fā)環(huán)境的方法步驟
本篇文章主要介紹了React Native 搭建開發(fā)環(huán)境的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10