網站首頁 編程語言 正文
useEffect 永遠是在 DOM渲染完成之后執行
1.理解函數副作用
什么是副作用?
對于React組件來說,主作用是根據數據(state/props)渲染UI,除此之外都是副作用(比如手動修改DOM、發送ajax請求)。
常見的副作用
- 數據請求(發送ajax)
- 手動修改 DOM
- localstorage操作
useEffect 函數的作用就是為react函數組件
提供副作用
2.基礎使用
使用步驟
- 導入
useEffect
函數 - 調用
useEffect
函數,并傳入回調函數 - 在回調函數中編寫副作用處理
- 修改數據狀態
- 檢測副作用是否生效
示例代碼
import {useState, useEffect} from 'react'; function App() { const [count, setCount] = useState(0); useEffect(() => { console.log("觸發副作用"); document.title = `點擊了${count}次`; }); return ( <div> <button onClick={() => setCount(count + 1)}>點擊{count}次</button> </div> ) }
3.依賴項控制
副作用執行時機
1.默認狀態(無依賴項)
上邊的示例中,組件初始化時先觸發一次(console出內容),之后每次點擊按鈕,都會觸發 副作用。
useEffect 可執行多次。
2.依賴項 為空
useEffect 函數還可以接收第二個參數,作為該副作用的依賴項,當第二個參數 傳入一個空數組[] 時,表明只有 組件初始化的時候執行一次:
咱們對上邊的案例做下 微調
function App() { const [count, setCount] = useState(0); useEffect(() => { console.log("觸發副作用"); document.title = `點擊了${count}次`; }, []); // 注意這里,傳入 [] return ( <div> <button onClick={() => setCount(count + 1)}>點擊{count}次</button> </div> ) }
可以看到當點擊按鈕時,title 不再改變。
3.依賴特定項
當依賴項數組中傳入值時,那么該副作用會在 組件初始化的時候執行一次,依賴的特定項變化時會再次執行
function App() { const [count, setCount] = useState(0); const [name, setName] = useState('李白'); useEffect(() => { console.log('觸發渲染') document.title = `clicked ${count} times`; console.log('name: ', {name}); },[count]) // 這里我們傳入 count,不傳name return ( <> <p>當前次數:{count}</p> <p><button onClick={() => setCount(count + 1)}>累計</button></p> <p><button onClick={() => setName("杜甫")}>改名{name}</button></p> </> ) }
如上,當我們點擊 “累計” 按鈕時,會console內容,title也會改變,但是我們點擊 “改名”時,不會發生變化,就是因為我們在依賴項數組中傳入了 “count” 而沒有 “name”。
4.注意事項
只要在 useEffect 回調函數中用到的數據狀態就應該出現在依賴項數組中聲明,否則可能會有bug。
5.清除副作用
在組件被銷毀時,如果有些副作用操作需要被清理,比如常見的定時器等,可通過useEffect return回調函數
的方式清理副作用。
語法如下:
useEffect(() => { console.log('副作用函數執行'); return () => { console.log('清理副作用的函數執行'); // 這里執行 清理副作用的代碼 } })
示例:
function Test() { useEffect(() => { let timer = setInterval(() => { console.log('this is effect'); }, 1000) // 這里return 一個回調函數,在函數中清除副作用 return () => { clearInterval(timer); } }) return ( <div>Test</div> ) } function App() { const [flag, setFlag] = useState(true); return ( <div> {flag ? <Test/> : null} <div> <button onClick={() => setFlag(!flag)}>點擊</button> </div> </div> ) }
6.發送網絡請求
不可以直接在 useEffect 的回調函數外層直接包裹await,因為異步會導致清理函數無法立即返回
?錯誤示例:
useEffect(async () => { const res = await getData('url'); console.log(res); })
可在 useEffect 中定義一個請求數據方法,調用。
正確示例
:
useEffect(() => { async function initData() { const res = await getData('url'); console.log(res); } initData() }, []) // 僅組件初始化時調用
原文鏈接:https://blog.csdn.net/RedaTao/article/details/123899263
相關推薦
- 2022-04-18 uniapp 獲取元素距離頂部的距離,實現頁面滾動元素消失后懸浮在底部的效果
- 2022-07-13 Python內建類型int源碼學習_python
- 2022-02-27 jwt Claims token 秘鑰稍有不同也能解析成功 signWith setSigningK
- 2023-05-08 Android開發多手指觸控事件處理_Android
- 2022-09-13 Android四大組件之Activity深入解讀生命周期_Android
- 2022-05-28 C語言實現宿舍管理課程設計_C 語言
- 2022-05-31 Android實現調用手機攝像頭錄像限制錄像時長_Android
- 2022-09-17 Pandas中df.loc[]與df.iloc[]的用法與異同?_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支