React自定義實(shí)現(xiàn)useWatch的方式和特點(diǎn)
如何實(shí)現(xiàn)類似Vue中watch
功能的useWatch
自定義Hook,以下是幾種常見的實(shí)現(xiàn)方式和特點(diǎn):
1. 基礎(chǔ)實(shí)現(xiàn)
import { useEffect, useRef } from 'react'; function useWatch<T>(value: T, callback: (prev?: T) => void) { const prev = useRef<T>(); useEffect(() => { callback(prev.current); prev.current = value; }, [value]); }
- 特點(diǎn):簡單直接,監(jiān)聽值變化并執(zhí)行回調(diào),同時(shí)提供舊值。
- 使用場景:適用于大多數(shù)基本的監(jiān)聽需求。
2. 增加immediate選項(xiàng)
import { useEffect, useRef } from 'react'; type Config = { immediate: boolean; }; function useWatch<T>(value: T, callback: (prev?: T) => void, config: Config = { immediate: false }) { const { immediate } = config; const prev = useRef<T>(); const inited = useRef(false); useEffect(() => { const execute = () => callback(prev.current); if (!inited.current) { inited.current = true; if (immediate) { execute(); } } else { execute(); } prev.current = value; }, [value]); }
- 特點(diǎn):增加了
immediate
選項(xiàng),允許在組件初始化時(shí)立即執(zhí)行回調(diào)。 - 使用場景:當(dāng)需要在組件加載時(shí)立即執(zhí)行監(jiān)聽邏輯時(shí)非常有用。
3. 增加停止監(jiān)聽功能
import { useEffect, useRef } from 'react'; type Config = { immediate: boolean; }; function useWatch<T>(value: T, callback: (prev?: T) => void, config: Config = { immediate: false }) { const { immediate } = config; const prev = useRef<T>(); const inited = useRef(false); const stop = useRef(false); useEffect(() => { const execute = () => callback(prev.current); if (!stop.current) { if (!inited.current) { inited.current = true; if (immediate) { execute(); } } else { execute(); } prev.current = value; } }, [value]); return () => { stop.current = true; }; }
- 特點(diǎn):增加了停止監(jiān)聽的功能,允許動(dòng)態(tài)控制監(jiān)聽的開啟和關(guān)閉。
- 使用場景:適用于需要在某些條件下動(dòng)態(tài)停止監(jiān)聽的場景。
4. 使用lodash進(jìn)行深度比較
import { useEffect, useRef } from 'react'; import { isEqual } from 'lodash'; function useWatch<T>(value: T, callback: (prev?: T) => void, config: Config = { immediate: false }) { const { immediate } = config; const prev = useRef<T>(); const inited = useRef(false); useEffect(() => { const execute = () => { if (!isEqual(prev.current, value)) { callback(prev.current); } }; if (!inited.current) { inited.current = true; if (immediate) { execute(); } } else { execute(); } prev.current = value; }, [value]); }
- 特點(diǎn):使用
lodash
的isEqual
方法進(jìn)行深度比較,確保監(jiān)聽的值是真正發(fā)生變化時(shí)才執(zhí)行回調(diào)。 - 使用場景:適用于監(jiān)聽復(fù)雜數(shù)據(jù)結(jié)構(gòu)(如對象或數(shù)組)的變化。
使用示例
import React, { useState } from 'react'; import { useWatch } from './useWatch'; function App() { const [count, setCount] = useState(0); useWatch(count, (oldCount) => { console.log(`count changed from ${oldCount} to ${count}`); }, { immediate: true }); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); } export default App;
總結(jié)
這些實(shí)現(xiàn)方式各有特點(diǎn),可以根據(jù)具體需求選擇合適的版本。如果需要簡單的監(jiān)聽功能,基礎(chǔ)實(shí)現(xiàn)就足夠了;如果需要更復(fù)雜的控制,如立即執(zhí)行或停止監(jiān)聽,則可以選擇帶有immediate
和停止功能的版本。
到此這篇關(guān)于React自定義實(shí)現(xiàn)useWatch的方式和特點(diǎn)的文章就介紹到這了,更多相關(guān)React自定義useWatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解React?Native項(xiàng)目中啟用Hermes引擎
這篇文章主要為大家介紹了React?Native項(xiàng)目中啟用Hermes引擎實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09React函數(shù)式組件Hook中的useEffect函數(shù)的詳細(xì)解析
useEffect是react v16.8新引入的特性。我們可以把useEffect hook看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三個(gè)函數(shù)的組合2022-10-10React?Hooks項(xiàng)目實(shí)戰(zhàn)
React?Hooks是React?16.8版本引入的新特性,它使得在函數(shù)組件中也能夠使用狀態(tài)(state)和其他React特性,本文就來詳細(xì)介紹一下React?Hooks項(xiàng)目實(shí)戰(zhàn),感興趣的可以了解一下2023-11-11使用React路由實(shí)現(xiàn)頁面導(dǎo)航的示例代碼
在構(gòu)建現(xiàn)代Web應(yīng)用程序時(shí),前端路由是一個(gè)不可或缺的部分,今天,我們將討論如何在React中使用React Router來實(shí)現(xiàn)頁面導(dǎo)航,在這篇博客中,我們將會探索路由的基本概念,設(shè)置React Router,并通過示例代碼來展示如何實(shí)現(xiàn)復(fù)雜的頁面導(dǎo)航,需要的朋友可以參考下2025-02-02