在寫React應用的時候,在組件中常常用到componentWillUnmount
生命週期函數(組件將要被卸載時執行)。好比咱們的定時器要清空,避免發生內存泄漏;好比登陸狀態要取消掉,避免下次進入信息出錯。因此這個生命週期函數也是必不可少的,這節課就來用useEffect
來實現這個生命週期函數,並講解一下useEffect
容易踩的坑。javascript
學習React Hooks
時,咱們要改掉生命週期函數的概念(人每每有先入爲主的毛病,因此很難改掉),由於Hooks
叫它反作用,因此componentWillUnmount
也能夠理解成解綁反作用。這裏爲了演示用useEffect
來實現相似componentWillUnmount
效果,先安裝React-Router
路由,進入項目根本錄,使用npm
進行安裝。html
npm install --save react-router-dom
而後打開Example.js
文件,進行改寫代碼,先引入對應的React-Router
組件java
import { BrowserRouter as Router, Route, Link } from "react-router-dom"
在文件中編寫兩個新組件,由於這兩個組件都很是的簡單,因此就不單獨創建一個新的文件來寫了。react
function Index() { return <h2>JSPang.com</h2>; } function List() { return <h2>List-Page</h2>; }
有了這兩個組件後,接下來能夠編寫路由配置,在之前的計數器代碼中直接增長就能夠了。npm
return ( <div> <p>You clicked {count} times</p> <button onClick={()=>{setCount(count+1)}}>click me</button> <Router> <ul> <li> <Link to="/">首頁</Link> </li> <li><Link to="/list/">列表</Link> </li> </ul> <Route path="/" exact component={Index} /> <Route path="/list/" component={List} /> </Router> </div> )
而後到瀏覽器中查看一下,看看組件和路由是否可用。若是可用,咱們如今能夠調整useEffect
了。在兩個新組件中分別加入useEffect()
函數:數組
function Index() { useEffect(()=>{ console.log('useEffect=>老弟,你來了!Index頁面') ) return <h2>JSPang.com</h2>; } function List() { useEffect(()=>{ console.log('useEffect=>老弟,你來了!List頁面') }) return <h2>List-Page</h2>; }
這時候咱們點擊Link
進入任何一個組件,在瀏覽器中都會打印出對應的一段話。這時候能夠用返回一個函數的形式進行解綁,代碼以下:瀏覽器
function Index() { useEffect(()=>{ console.log('useEffect=>老弟你來了!Index頁面') return ()=>{ console.log('老弟,你走了!Index頁面') } }) return <h2>JSPang.com</h2>; }
這時候你在瀏覽器中預覽,咱們彷彿實現了componentWillUnmount
方法。但這只是好像實現了,當點擊計數器按鈕時,你會發現老弟,你走了!Index頁面
,也出現了。這究竟是怎麼回事那?其實每次狀態發生變化,useEffect
都進行了解綁。react-router
那到底要如何實現相似componentWillUnmount
的效果那?這就須要請出useEffect
的第二個參數,它是一個數組,數組中能夠寫入不少狀態對應的變量,意思是當狀態值發生變化時,咱們才進行解綁。可是當傳空數組[]
時,就是當組件將被銷燬時才進行解綁,這也就實現了componentWillUnmount
的生命週期函數。dom
function Index() { useEffect(()=>{ console.log('useEffect=>老弟你來了!Index頁面') return ()=>{ console.log('老弟,你走了!Index頁面') } },[]) return <h2>JSPang.com</h2>; }
爲了更加深刻了解第二個參數的做用,把計數器的代碼也加上useEffect
和解綁方法,並加入第二個參數爲空數組。代碼以下:jsp
function Example(){ const [ count , setCount ] = useState(0); useEffect(()=>{ console.log(`useEffect=>You clicked ${count} times`) return ()=>{ console.log('====================') } },[]) return ( <div> <p>You clicked {count} times</p> <button onClick={()=>{setCount(count+1)}}>click me</button> <Router> <ul> <li> <Link to="/">首頁</Link> </li> <li><Link to="/list/">列表</Link> </li> </ul> <Route path="/" exact component={Index} /> <Route path="/list/" component={List} /> </Router> </div> ) }
這時候的代碼是不能執行解綁反作用函數的。可是若是咱們想每次count
發生變化,咱們都進行解綁,只須要在第二個參數的數組裏加入count
變量就能夠了。代碼以下:
function Example(){ 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="/">首頁</Link> </li> <li><Link to="/list/">列表</Link> </li> </ul> <Route path="/" exact component={Index} /> <Route path="/list/" component={List} /> </Router> </div> ) }
這時候只要count
狀態發生變化,都會執行解綁反作用函數,瀏覽器的控制檯也就打印出了一串=================
。
轉自:https://jspang.com/posts/2019/08/12/react-hooks.html