react?hooks頁面實(shí)時(shí)刷新方式(setInterval)
1. 實(shí)現(xiàn)
頁面實(shí)時(shí)刷新一般用定時(shí)器(setInterval())實(shí)現(xiàn)。
- 定時(shí)器:setInterval() - 每多少秒執(zhí)行一次指定的代碼。(執(zhí)行多次)
- 延時(shí)器:setTimeout() - 多少秒以后執(zhí)行指定代碼。(執(zhí)行1次)
定時(shí)器與延時(shí)器均為異步程序,放在異步隊(duì)列里執(zhí)行!
2. 注意點(diǎn)
- 1. 頁面使用定時(shí)器一定要記得清除。
- 2. useEffect 的數(shù)組依賴不要忘記,不然只執(zhí)行一次。
- 3. 也可以使用useRef(為了避免setInterval變量形成閉包)
方式一:使用數(shù)組依賴
function Index() { const [count, setCount] = useState(0); useEffect(() => { const timer = setInterval(() => { //可以調(diào)接口 //可以存state,如setCount(count + 1) //可以調(diào)其他函數(shù) }, 1000); return () => clearInterval(timer); //清除定時(shí)器不要忘記 }, [count]); //數(shù)組依賴不要忘記 return <div>{count}</div>; }
方式二:使用useRef
function Index() { const savecallback=useRef(null); //為了避免形成閉包 function callback(){ // 可以調(diào)其他函數(shù) // 可以調(diào)接口 } /*每當(dāng)組件被重新渲染,useEffect 都會(huì)將最新的回調(diào)函數(shù)賦值給 ref.current,接著 ref.current會(huì)被放到 setInterval 里去執(zhí)行。所以 setInterval 雖只在組件初始化時(shí)被啟動(dòng)了一次,但它在執(zhí)行每次定時(shí)任務(wù)時(shí),使用的都是最新的回調(diào)函數(shù)?;卣{(diào)函數(shù)不再被困于閉包當(dāng)中,最新的 state、props 自然能夠被取到。*/ useEffect(() => { (savecallback as any).current = callback; }); useEffect(() => { const timer = setInterval(() => { (savecallback as any).current(); }, 1000); return () => clearInterval(timer); }, []); return <div>頁面</div>; }
方式三:使用useReducer 狀態(tài)管理
(對(duì)于定時(shí)更新某個(gè)變量更友好,定時(shí)調(diào)接口的話還是上邊兩種更方便一點(diǎn))
const intitstate= {count: 0}; function reducer(state = 0,action) { return {count: state.count + 1}; } export default function Index() { const [state, dispatch] = useReducer(reducer,intitstate); useEffect(() => { setInterval(() => { dispatch(); }, 1000); }, []); return <div>{state.count}</div>; }
因?yàn)殚]包的原因,回調(diào)函數(shù)無法取到最新的 state,而大多數(shù)場(chǎng)景下我們更新 state 前又必須先獲取 state 的當(dāng)前值。
那如何才能夠在不讀取最新 state 的前提下,對(duì) state 進(jìn)行增量更新,可以用useReducer 狀態(tài)管理。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
React實(shí)現(xiàn)一個(gè)通用骨架屏組件示例
骨架屏就是在頁面數(shù)據(jù)尚未加載前先給用戶展示出頁面的大致結(jié)構(gòu),直到請(qǐng)求數(shù)據(jù)返回后再渲染頁面,補(bǔ)充進(jìn)需要顯示的數(shù)據(jù)內(nèi)容,本文就介紹了React實(shí)現(xiàn)一個(gè)通用骨架屏組件示例,分享給大家,感興趣的可以了解一下2021-12-12在react-router4中進(jìn)行代碼拆分的方法(基于webpack)
這篇文章主要介紹了在react-router4中進(jìn)行代碼拆分的方法(基于webpack),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03react?Scheduler?實(shí)現(xiàn)示例教程
這篇文章主要為大家介紹了react?Scheduler?實(shí)現(xiàn)示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09React版本18.xx降低為17.xx的方法實(shí)現(xiàn)
由于現(xiàn)在react默認(rèn)創(chuàng)建是18.xx版本,但是我們現(xiàn)在大多使用的還是17.xx或者更低的版本,于是要對(duì)react版本進(jìn)行降級(jí),本文主要介紹了React版本18.xx降低為17.xx的方法實(shí)現(xiàn),感興趣的可以了解一下2023-11-11React通過useContext特性實(shí)現(xiàn)組件數(shù)據(jù)傳遞
本文主要介紹了React如何通過useContext特性實(shí)現(xiàn)組件數(shù)據(jù)傳遞,文中有相關(guān)的代碼示例供大家參考,對(duì)我們學(xué)習(xí)React有一定的幫助,需要的朋友可以參考下2023-06-06React生命周期與父子組件間通信知識(shí)點(diǎn)詳細(xì)講解
生命周期函數(shù)指在某一時(shí)刻組件會(huì)自動(dòng)調(diào)用并執(zhí)行的函數(shù)。React每個(gè)類組件都包含生命周期方法,以便于在運(yùn)行過程中特定的階段執(zhí)行這些方法2022-11-11