最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中Hooks邏輯復(fù)用的實(shí)現(xiàn)

 更新時(shí)間:2026年03月22日 15:55:58   作者:發(fā)現(xiàn)一只大呆瓜  
在React開(kāi)發(fā)中,Hooks的出現(xiàn)徹底改變了邏輯復(fù)用的方式,本文就來(lái)介紹一下Hooks邏輯復(fù)用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在 React 開(kāi)發(fā)中,Hooks 的出現(xiàn)徹底改變了邏輯復(fù)用的方式。它讓我們能夠?qū)?fù)雜的、可復(fù)用的邏輯從 UI 組件中抽離,實(shí)現(xiàn)真正的“關(guān)注點(diǎn)分離”。本文將分享 Hooks 的核心原則,并提供 4 個(gè)在真實(shí)業(yè)務(wù)場(chǎng)景中封裝的實(shí)戰(zhàn)案例。

一、 Hooks 核心

1. 概念理解

Hooks 本質(zhì)上是將組件間共享的邏輯抽離并封裝成的特殊函數(shù)。

2. 使用“紅線(xiàn)”:規(guī)則與原理

  • 命名規(guī)范:必須以 use 開(kāi)頭(如 useChat),這不僅是約定,也是靜態(tài)檢查工具(ESLint)識(shí)別 Hook 的依據(jù)。
  • 調(diào)用位置嚴(yán)禁在循環(huán)、條件判斷或嵌套函數(shù)中調(diào)用 Hook。

底層原理: React 內(nèi)部并不是通過(guò)“變量名”來(lái)記錄 Hook 狀態(tài)的,而是通過(guò)鏈表 。每次渲染時(shí),React 嚴(yán)格依賴(lài) Hook 的調(diào)用順序來(lái)查找對(duì)應(yīng)的狀態(tài)。

注意: 如果在 if 語(yǔ)句中調(diào)用 Hook,一旦條件不成立導(dǎo)致某次渲染跳過(guò)了該 Hook,整個(gè)鏈表的指針就會(huì)錯(cuò)位,導(dǎo)致?tīng)顟B(tài)讀取異常。

二、 實(shí)戰(zhàn):自定義 Hooks 封裝

1. AI 場(chǎng)景:消息點(diǎn)贊/點(diǎn)踩邏輯 (useChatEvaluate)

在 AI 對(duì)話(huà)系統(tǒng)中,消息評(píng)價(jià)是通用功能。我們需要處理:狀態(tài)切換(點(diǎn)贊 -> 取消點(diǎn)贊)、單選邏輯、以及異步接口調(diào)用。

import React, { useState } from 'react';

// 模擬接口
const public_evaluateMessage = async (params: any) => ({ data: true });

type EvaluateType = "GOOD" | "BAD" | "NONE";

export const useChatEvaluate = (initialType: EvaluateType = "NONE") => {
  const [ratingType, setRatingType] = useState<EvaluateType>(initialType);

  const evaluateMessage = async (contentId: number, type: "GOOD" | "BAD") => {
    let newEvaluateType: EvaluateType;

    // 邏輯:如果點(diǎn)擊已選中的類(lèi)型,則取消選中(NONE);否則切換到新類(lèi)型
    if (type === "GOOD") {
      newEvaluateType = ratingType === "GOOD" ? "NONE" : "GOOD";
    } else {
      newEvaluateType = ratingType === "BAD" ? "NONE" : "BAD";
    }

    try {
      const res = await public_evaluateMessage({
        contentId,
        ratingType: newEvaluateType,
        content: "",
      });

      if (res.data === true) {
        setRatingType(newEvaluateType);
      }
    } catch (error) {
      console.error("評(píng)價(jià)失敗:", error);
    }
  };

  return { ratingType, evaluateMessage };
};

// 使用示例
const ChatMessage: React.FC<{ id: number }> = ({ id }) => {
  const { ratingType, evaluateMessage } = useChatEvaluate();
  return (
    <button onClick={() => evaluateMessage(id, "GOOD")}>
      {ratingType === "GOOD" ? "?? 已點(diǎn)贊" : "?? 點(diǎn)贊"}
    </button>
  );
};

2. 響應(yīng)式布局:屏幕尺寸監(jiān)聽(tīng) (useMediaSize)

在響應(yīng)式系統(tǒng)中,封裝一個(gè)能根據(jù)窗口寬度自動(dòng)切換“設(shè)備類(lèi)型”的 Hook,可以極大地簡(jiǎn)化響應(yīng)式開(kāi)發(fā)。

import { useState, useEffect, useMemo } from 'react';

export enum MediaType {
  mobile = 'mobile',
  tablet = 'tablet',
  pc = 'pc',
}

const useMediaSize = (): MediaType => {
  const [width, setWidth] = useState<number>(globalThis.innerWidth);

  useEffect(() => {
    const handleWindowResize = () => setWidth(window.innerWidth);
    window.addEventListener('resize', handleWindowResize);
    // 記得清理事件監(jiān)聽(tīng)
    return () => window.removeEventListener('resize', handleWindowResize);
  }, []);

  // 使用 useMemo 避免每次渲染都重新運(yùn)行計(jì)算邏輯
  const media = useMemo(() => {
    if (width <= 640) return MediaType.mobile;
    if (width <= 768) return MediaType.tablet;
    return MediaType.pc;
  }, [width]);

  return media;
};

export default useMediaSize;

3. 性能優(yōu)化:防抖與節(jié)流 Hook

A. 防抖 Hook (useDebounce)

常用于搜索框,防止用戶(hù)快速輸入時(shí)頻繁觸發(fā)請(qǐng)求。

import { useState, useEffect } from 'react';

function useDebounce<T>(value: T, delay: number): T {
  const [debouncedValue, setDebouncedValue] = useState<T>(value);

  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

    // 關(guān)鍵:在下一次 useEffect 執(zhí)行前清理上一次的定時(shí)器
    return () => clearTimeout(handler);
  }, [value, delay]);

  return debouncedValue;
}

export default useDebounce;

B. 節(jié)流 Hook (useThrottle)

常用于滾動(dòng)加載、窗口縮放,確保在規(guī)定時(shí)間內(nèi)只執(zhí)行一次。

import { useState, useEffect, useRef } from 'react';

function useThrottle<T>(value: T, delay: number): T {
  const [throttledValue, setThrottledValue] = useState<T>(value);
  const lastExecuted = useRef<number>(Date.now());

  useEffect(() => {
    const now = Date.now();
    const remainingTime = delay - (now - lastExecuted.current);

    if (remainingTime <= 0) {
      // 立即執(zhí)行
      setThrottledValue(value);
      lastExecuted.current = now;
    } else {
      // 設(shè)置定時(shí)器處理剩余時(shí)間
      const timer = setTimeout(() => {
        setThrottledValue(value);
        lastExecuted.current = Date.now();
      }, remainingTime);

      return () => clearTimeout(timer);
    }
  }, [value, delay]);

  return throttledValue;
}

export default useThrottle;

三、 總結(jié):封裝自定義 Hook 的心法

  1. 抽離狀態(tài)而非僅邏輯:如果一段邏輯只涉及純函數(shù)計(jì)算,不需要 Hook;只有涉及 useState 或 useEffect 等狀態(tài)管理時(shí),才有必要封裝 Hook。
  2. 保持純凈:自定義 Hook 應(yīng)該只關(guān)心邏輯,而不應(yīng)該直接操作 DOM。
  3. TS 類(lèi)型保護(hù):利用泛型 <T> 增強(qiáng) Hook 的兼容性,讓它能適配各種數(shù)據(jù)類(lèi)型。

到此這篇關(guān)于React中Hooks邏輯復(fù)用的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)React中Hooks邏輯復(fù)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • antd?table動(dòng)態(tài)修改表格高度的實(shí)現(xiàn)

    antd?table動(dòng)態(tài)修改表格高度的實(shí)現(xiàn)

    本文主要介紹了antd?table動(dòng)態(tài)修改表格高度的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • react中useReducer復(fù)雜狀態(tài)管理

    react中useReducer復(fù)雜狀態(tài)管理

    React的useReducer Hook適用于管理復(fù)雜的狀態(tài)邏輯,通過(guò)集中化的reducer函數(shù)處理狀態(tài)更新,提升代碼可維護(hù)性,下面就來(lái)介紹一下react中useReducer復(fù)雜狀態(tài)管理
    2026-01-01
  • React Hook 父子組件相互調(diào)用函數(shù)方式

    React Hook 父子組件相互調(diào)用函數(shù)方式

    這篇文章主要介紹了React Hook 父子組件相互調(diào)用函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • React服務(wù)端渲染(總結(jié))

    React服務(wù)端渲染(總結(jié))

    當(dāng)我們要求渲染時(shí)間盡量快、頁(yè)面響應(yīng)速度快時(shí)就會(huì)用到服務(wù)端渲染,本篇文章主要介紹了React服務(wù)端渲染,有興趣的可以了解一下
    2017-07-07
  • react echarts tooltip 區(qū)域新加輸入框編輯保存數(shù)據(jù)功能

    react echarts tooltip 區(qū)域新加輸入框編輯保存數(shù)據(jù)功能

    這篇文章主要介紹了react echarts tooltip 區(qū)域新加輸入框編輯保存數(shù)據(jù)功能,大概思路是用一個(gè)div包裹echarts, 然后在echarts的同級(jí)新建一個(gè)div用來(lái)用來(lái)模擬真實(shí)tooltip,通過(guò)鼠標(biāo)移入移出事件控制真實(shí)tooltip的顯示與隱藏,需要的朋友可以參考下
    2023-05-05
  • React中setState使用原理解析

    React中setState使用原理解析

    這篇文章主要介紹了React中的setState使用細(xì)節(jié)和原理解析,主要包括使用setstate的原因及基本用法,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • react native創(chuàng)建項(xiàng)目常用插件詳解

    react native創(chuàng)建項(xiàng)目常用插件詳解

    文章詳細(xì)介紹了React Native項(xiàng)目的頁(yè)面路徑目錄設(shè)計(jì)原則、路由管理、狀態(tài)管理、服務(wù)層管理、自定義hook和工具函數(shù)的使用方法、適配方案以及樣式排列對(duì)齊方式,通過(guò)這些原則和方法,可以提高項(xiàng)目的可維護(hù)性和可擴(kuò)展性
    2025-12-12
  • React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼

    React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼

    顏色選擇器是一個(gè)用于選擇和調(diào)整顏色的工具,它可以讓用戶(hù)選擇他們喜歡的顏色,本文主要介紹了React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • React獲取input值并提交的2種方法實(shí)例

    React獲取input值并提交的2種方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于React獲取input值并提交的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • React-Native中一些常用組件的用法詳解(二)

    React-Native中一些常用組件的用法詳解(二)

    這篇文章主要跟大家介紹了關(guān)于React-Native中一些常用組件的用法的相關(guān)資料,其中詳細(xì)介紹了關(guān)于ScrollView組件、ListView組件、Navigator組件、TableBarIOS組件以及網(wǎng)絡(luò)請(qǐng)求等相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06

最新評(píng)論

泸州市| 公主岭市| 德庆县| 云和县| 博罗县| 弋阳县| 伽师县| 峨边| 福泉市| 兴宁市| 邵阳市| 广元市| 连云港市| 合肥市| 平原县| 洞口县| 乌恰县| 高雄市| 玉树县| 达孜县| 卢湾区| 东山县| 师宗县| 衡山县| 清水河县| 南充市| 象州县| 湟中县| 广宗县| 汝城县| 乌拉特中旗| 高淳县| 沁水县| 祁门县| 绍兴市| 高尔夫| 双鸭山市| 兴国县| 八宿县| 长治县| 蓝山县|