溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Hooks怎么封裝與使用

發(fā)布時間:2023-01-05 09:29:05 來源:億速云 閱讀:131 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Hooks怎么封裝與使用的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    Hooks是什么?

    本篇文章主要介紹Hooks如何在React與Vue3兩大框架中封裝使用。

    Hooks就是當(dāng)代碼執(zhí)行在某個執(zhí)行階段,觸發(fā)被鉤子鉤到的事件函數(shù)或者回調(diào)函數(shù),Hooks的概念最早在React的V16.8.0版本正式推出,后面Vue3的出現(xiàn)也引入Hooks的概念,兩者使用Hooks還是會有所差異。

    Hooks解決了什么?

    • 完善代碼能力

    • 組件邏輯復(fù)用

    HOC與HOOK對比

    HOC概念:hoc是React中用于重用組件邏輯的一種高級技術(shù)實現(xiàn)模式,它本身是一個函數(shù),接受一個組件并返回一個新的組件

    • HOC

    function Hocomponent(WrappedComponent, selectData) {
      return class extends React.Component {
        constructor(props) {
          super(props);
          this.state = {
            data: selectData(DataSource, props)
          };
        } 
        render() {
          // ... 并使用新數(shù)據(jù)渲染被包裝的組件!
          return <WrappedComponent data={this.state.data} {...this.props} />;
        }
      };

    上邊的例子可以看出高階組件內(nèi)部返回了一個類組件,通過這個類組件對WrappedComponent進(jìn)行包裝,在返回得到一個全新的組件。但是HOC的缺點就是props可能會被覆蓋,而且容易產(chǎn)生嵌套地域。

    • Hooks

    react-Hooks的出現(xiàn)主要彌補(bǔ)函數(shù)組件無狀態(tài)無生命周期問題等,主要應(yīng)對class復(fù)雜組件變的難以理解,邏輯混亂,不易拆解和測試與嵌套地域問題。

    分別使用React與Vue3兩種框架封裝useThrottle鉤子函數(shù)

    • React實現(xiàn)節(jié)流Hooks

    import { useState, useCallback } from "react"; 
    export function useThrottleFn(fn, time) {
        let [isTimer,setIsTimer] = useState<any>(null);  
        const clear = () => {
            clearTimeout(isTimer);
            setIsTimer(null) 
        } 
        let throttle = useCallback(()=>{ 
            if (!isTimer) {
                setIsTimer(setTimeout(() => {
                    fn()
                    clear() 
                }, time)) 
            }
        },[fn, time])
        return [throttle]
    }
    // 引入使用
      const [throttle] = useThrottleFn((e)=>{
            console.log(e)
        },500)
        const Ceshi  = ()=>{
            let e = 'Hooks'
            throttle(e);
        }

    React內(nèi)部也存在很多的Hooks鉤子,常用的鉤子:

    useState,useMemo,useCallback,useRef,useContext,但是這些鉤子必須在函數(shù)組件中使用并且在函數(shù)組件中使用鉤子需要在組件頂層調(diào)用,不能在Class中使用。這樣一來讓我們可以揮手告別this.xxx的時代。

    • Vue3實現(xiàn)節(jié)流Hooks

    import { ref, unref, watch } from 'vue';
    import { useTimeouts } from './useTimeout';
    /**
     *
     * @param fn 回調(diào)函數(shù)
     * @param wait 延遲時間
     * @returns
     */
    export function useThrottleFn(fn, wait = 80) {
      if (typeof fn !== 'function') {
        return;
      }
      let Timer: any = null;  
      const isReady = ref<Boolean>(false);
      const clearun = () => {
        Timer && clearTimeout(Timer);
      };
      // 閉包實現(xiàn)節(jié)流封裝   
      return function () {
        const _this = this;
        const args = arguments;
        // 更改狀態(tài)觸發(fā)watch監(jiān)聽,觸發(fā)回調(diào)函數(shù)fn
        const startFun = function () {
          isReady.value = true;
        };
        // 這里利用watch監(jiān)聽isReady的狀態(tài)變化執(zhí)行回到函數(shù),而不是直接將回調(diào)函數(shù)放在定時器中
        watch(
          () => unref(isReady),
          () => {
            if (unref(isReady) && Timer) {
              fn.apply(_this, args);
              isReady.value = false;
              Timer = null;
              clearun();
            }
          },
        );
        // Timer 如果不存在就開始執(zhí)行
        if (!Timer) {
          Timer = setTimeout(startFun, wait);
        }
      };
    }
    // 引入使用
    const Ceshi = useThrottleFn(()=>{
          console.log('Hooks')
    },300)

    Vue3的發(fā)布隨之帶來了很多新特性比如從選項式API到組合式API,引入Hooks等。那這里在介紹一個新的工具庫Vueuse,Vueuse 基于Vue-demi封裝了大量的鉤子工具函數(shù),比如useDark,useToggle其他點擊Vueuse文檔查看更多,并且在Vue2與Vue3都可以使用。當(dāng)然我們也可以自己自定義按需求封裝Hooks,但在Vue3中使用Hooks需要在setup中使用,由setup作為組合式API的入口點,在Vue2使用需要安裝VueCompositionApi進(jìn)行使用。

    以上就是“Hooks怎么封裝與使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI