快速学会自定义Hook

自定义Hook的作用

将组件逻辑提取到可重用的函数中

实现一个自定义Hook抽象鼠标跟踪器

创建一个文件useMousePosition

import {useState,useEffect} from 'react'

// 自定义hook必须要use开头
// 在两个组件中使用相同的hook不会共享state
const useMousePosition = () =>{
    const [position,setPosition] = useState({x:0,y:0})
    useEffect(()=>{
        console.log("add Effect",position.x);
        
        const updateMouse = (e:MouseEvent)=>{
        
            setPosition({x:e.clientX,y:e.clientY})
        }
        document.addEventListener('mousemove', updateMouse)
        return ()=>(
            // 清楚前面的click事件的Effect
            // console.log(1)
            document.removeEventListener('click', updateMouse)
            
        )

    },[])
    return position
}

export default useMousePosition

在另一个文件中的使用

import useMousePosition from './Hook/useMousePosition'


....



  return (
   <div style={{margin:"auto 0"}}>
      <p>X:{position.x},y:{position.y}</p>
        <LikeBUtton></LikeBUtton>
        {/* <MouseTrack></MouseTrack> */}
     
    </div>
  );

注意在两个相同的组件中使用hook是不会共享state的

实现一个自定义点击按钮重新加载图片的hook

创建文件useURLLoader.tsx

import {useState,useEffect} from 'react'
import axios from 'axios'

const useURLLoader = (url:string,deps:any[]=[])=>{
    const [data,setData] = useState<any>(null)
    const [loading,setLoading] = useState(true)
    useEffect(()=>{
        setLoading(true)
        axios.get(url).then(res=>{
            setData(res.data)
            // console.log(data);
        
        })
        setLoading(false)
        // console.log(loading)
    },[deps])
    return [data,loading]
}

export default useURLLoader

在需要使用的地方这样使用

import useURLLoader from './Hook/useURLLoader'

interface IShowResult {
  message:string;
  status:string;
}

const [show,setShow] = useState(true)
  const [data,loading] = useURLLoader('https://dog.ceo/api/breeds/image/random',[show])
  const dogRes = data as IShowResult



return (  <button onClick={()=>{setShow(!show)}}>Toggle Tracker</button>
      {loading?<p>读取中...</p>:<img src={dogRes&&dogRes.message} alt="图片"></img>}
      )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值