網站首頁 編程語言 正文
前言
使用緣由:
在函數中當請求數據時并且給state賦值會導致整個函數刷新,
從而導致死循環的進行數據請求, 所以這時候可以用到useEffect
介紹
- useEffect(處理副作用)
- useLayoutEffect(同步執行副作用)
使用
空依賴
import axios from 'axios';
import React,{useEffect, useState} from 'react';
function Test2() {
const [list,setlist] =useState([])
useEffect(()=>{
axios.get("./test.json").then(res=>{
console.log(res.data)
setlist(res.data)
})
},[])//參數1是函數,參數2是數組
return (
<div>
{
list.map(item=>
<li key={item.id}>{item.name}</li>
)
}
</div>
);
}
export default Test2;
傳空數組表示無依賴,只執行一次
非空依賴
數組傳依賴,當該依賴更新后也會進行執行(可以想象成class類的更新)
下方案例代表第一次執行,name被更新后也會進行執行
/**
* 傳非空數組
*/
import axios from 'axios';
import React,{useEffect, useState} from 'react';
function Test3() {
const [name,setname] =useState("peng-ke")
useEffect(()=>{
setname(name.substring(0,1).toUpperCase()+name.substring(1))
},[name])//參數1是函數,參數2是數組
return (
<div>
{name}
<button onClick={()=>{setname("study")}}>修改</button>
</div>
);
}
export default Test3;
實現銷毀操作
通過return函數執行銷毀后的行為
/**
* 模擬銷毀
*/
import React,{Component, useEffect, useState} from 'react';
function Children() {
const [name,setname] =useState("peng-ke")
useEffect(()=>{
window.onresize=()=>{
console.log("resize")
}
let timer=setInterval(() => {
console.log("ppppp")
}, 1000);
return ()=>{
console.log("銷毀");
window.onresize=null;
clearInterval(timer)
}
},[])
return (
<div>
碰磕
</div>
);
}
class Test4 extends Component{
state={
iscreated:true
}
render(){
return(
<div>
<button onClick={()=>{
this.setState({
iscreated:!this.state.iscreated
})
}}>點我</button>
{this.state.iscreated && <Children />}
</div>
)
}
}
export default Test4;
兩者區別
- 調用時機不同,useLayoutEffect和原來的componentDidMount&componentDidUpdate一致,在react完成DOM更新后馬上同步調用,這樣會阻塞頁面渲染,而useEffect是會在整個頁面渲染完成才會調用所以推薦使用useEffect
- 如果操作DOM的代碼推薦放在useLayoutEffect中
原文鏈接:https://blog.csdn.net/m_xiaozhilei/article/details/125251573
相關推薦
- 2022-07-12 git如何上傳本地項目
- 2022-10-17 Django?logging日志模塊實例詳解(日志記錄模板配置)_python
- 2022-10-23 C#中new操作符的工作機制_C#教程
- 2022-07-06 pyinstaller?pathex參數引發打包no?module?name異常_python
- 2022-01-10 cookie localstorage sessionstorage的區別
- 2022-08-03 GoFrame?gtree樹形結構的使用技巧示例_Golang
- 2022-09-08 Pandas如何將Timestamp轉為datetime類型_python
- 2022-04-09 如何利用Python獲取鼠標的實時位置_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同步修改后的遠程分支