当前位置: 首页 > news >正文

react自定义hook

自定义hook: 用来封装复用的逻辑,,自定义hook是以use开头的普通函数,,将组件中可复用的状态逻辑抽取到自定义的hook中,简化组件代码

常见自定义hook例子:

封装一个简单的计数器
import {useState} from "react";

function useCounter(initialValue:number){

    const [count, setCount] = useState(0)

    const increment = ()=>setCount(prev=>prev+1)

    const decrement = ()=>setCount(prev=>prev-1)

    const reset = ()=>setCount(initialValue)


    return {count,increment,decrement,reset}
}


export default useCounter

封装一个自动监听网页窗口变化的hooks
import {useEffect, useState} from "react";

function useWindowSize(){

    const [size, setSize] = useState({
        width:window.innerWidth,
        height:window.innerHeight
    })

    useEffect(() => {
        const handleResize = ()=>{
            setSize({
                width: window.innerWidth,
                height: window.innerHeight
            })
        }

        window.addEventListener("resize",handleResize)

        return ()=> window.removeEventListener("resize",handleResize)
    }, []);


    return size
}


export default useWindowSize

封装一个网络请求的hooks,返回请求的状态
import {useEffect, useState} from "react";
import axios from "axios";

interface FetchResult<T>{
    data:T | null,
    loading:boolean,
    error: Error | null
}
function useFetch<T = any>(url:string):FetchResult<T>{

    const [data, setData] = useState<T | null>(null)
    const [loading, setLoading] = useState(true)

    const [error, setError] = useState<Error | null>(null)

    useEffect(() => {
        const fetchData = async ()=>{
            try {
                const response = await axios.get(url)
                console.log(response)
                setData(response.data)
            } catch (e) {
                setError(e as Error)
            } finally {
                setLoading(false)
            }
        }

        fetchData()
    }, [url]);


    return {data,loading,error}

}


export default useFetch

hook设置获取localStorage
import {useState} from "react";

function useLocalStorage<T>(key:string,initialValue:T | null){

    const [storeValue, setStoreValue] = useState(()=>{
        try {
            var item = window.localStorage.getItem(key);
            return item ? JSON.parse(item) : initialValue
        } catch (e) {
            console.log(e)
            return initialValue
        }
    })


    const setValue = (val:T | null)=>{
        try {
            setStoreValue(val)
            if (val){
                window.localStorage.setItem(key, JSON.stringify(val))
            }else{
                window.localStorage.removeItem(key)
            }
        } catch (e) {
            console.log(e)
        }
    }

    return [storeValue,setValue] as const

}


export default useLocalStorage

调用hook:

import useCounter from "./useCounter";
import useWindowSize from "./useWindowSize";
import useFetch from "./useFetch";
import useLocalStorage from "./useLocalStorage";

function CustomHook(){

   const {count,increment,decrement,reset} = useCounter(10)

   const {width,height} =useWindowSize()

    const {data,loading,error} = useFetch("http://localhost:9090/hello")


    const [token,setToken] = useLocalStorage<String | null>("token",null)

    if (loading) return <div>loading ....</div>

    if (error) return  <div>error: {error.message}</div>
    return (
        <div>
           <div> {width}</div>
           <div> {height}</div>
            {count}
            <button onClick={increment}>increment</button>
            <button onClick={decrement}>decrement</button>

            {data}

            <h3> token is :{token}</h3>
            <button onClick={()=>setToken("123")}>123</button>

        </div>
    )
}

export default CustomHook

相关文章:

  • 排序复习_代码纯享
  • batman-adv 优化:基于信号强度(RSSI)选择链路
  • SpringCloud配置中心:Config Server与配置刷新机制
  • 使用 Python 和 python-pptx 构建 Markdown 到 PowerPoint 转换器
  • 华为OD机试 - 核酸最快检测效率 - 动态规划、背包问题(Java 2024 E卷 200分)
  • 深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
  • 基礎複分析習題3.複函數
  • 今天你学C++了吗?——二叉搜索树的拓展
  • API-Arrays
  • 【Python爬虫】使用python脚本拉取汽车网站品牌数据
  • 1.NextJS基础
  • skynet网络包库(lua-netpack.c)的作用解析
  • 关于大数据的基础知识(四)——大数据的意义与趋势
  • AQS是什么,使用应注意什么
  • 【CXX-Qt】4.5 Traits
  • 【AndroidRTC-11】如何理解webrtc的Source、TrackSink
  • QML指示控件:ScrollBar与ScrollIndicator
  • 【江协科技STM32】Unix时间戳(学习笔记)
  • java 设置操作系统编码、jvm平台编码和日志文件编码都为UTF-8的操作方式
  • AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
  • 党旗下的青春|83岁仍在“下生活”,他说生活是创作的源泉
  • 五一假期“热潮”来袭,计划南下的小伙伴注意了
  • 常熟银行一季度净赚超10亿增逾13%,净息差较上年末下降0.1个百分点
  • 铁线礁、牛轭礁珊瑚礁“体检”报告首次发布,专家:菲非法活动产生胁迫性影响
  • “网红”谭媛去世三年:未停更的账号和困境中的家庭
  • “两高”司法解释:升档为境外非法提供商业秘密罪的量刑标准