简单来说就是使用自定义hook可以将某些组件逻辑提取到可重用的函数中。 自定义hook是一个从use开始的调用其他hook的Javascript函数,下面看下react中创建自定义hooks的相关知识,感兴趣的朋友一起看看吧
一、什么是自定义hooks
逻辑复用
简单来说就是使用自定义hook可以将某些组件逻辑提取到可重用的函数中。 自定义hook是一个从use开始的调用其他hook的Javascript函数。
二、不使用自定义hook时
例1:当我们整个页面需要获取用户鼠标移动的坐标时,不使用hook的代码,我们可以这样写const [position, setPosition] = useState({
  x: 0,
  y: 0
})
useEffect(() => {
  const move = (e) => {
    setPosition({ x: e.x, y: e.y })
  }
  document.addEventListener('mousemove', move)
  return () => {
    document.removeEventListener('mousemove', move)
  }
}, [])
return (
  <div>
    x:{position.x}
    y:{position.y}
  </div>
)
 例2:当我们页面中有一个图片要跟随鼠标移动时,不使用hook的代码,我们也可以这样写:const [position, setPosition] = useState({
    x: 0,
    y: 0
  })
  useEffect(() => {
    const move = (e) => {
      setPosition({ x: e.x, y: e.y })
    }
    document.addEventListener(‘mousemove’, move)
    return () => {
      document.removeEventListener(‘mousemove’, move)
    }
  }, [])
  return (
    <div>
      <img
        src={img}
        style={{
          position: 'absolute',
          top: position.y,
          left: position.x,
        }}
        alt=""
      />
    </div>
  )
  很明显,以上两个例子呈现效果不同,但使用的逻辑代码大部分相同时,这些逻辑代码我们就可以使用hook进行逻辑复用
三、使用自定义hook
我们提取以上两个例子里可以复用的逻辑代码,新建一个名为useMousePosition的文件import { useState, useEffect } from 'react'
export default function useMousePosition() {
  const [position, setPosition] = useState({
    x: 0,
    y: 0
  })
  useEffect(() => {
    const move = (e) => {
      setPosition({ x: e.x, y: e.y })
    }
    document.addEventListener('mousemove', move)
    return () => {
      document.removeEventListener('mousemove', move)
    }
  }, [])
  return position
}
`我们在useMousePosition函数中提取了此功能。现在,我们可以将其导入到要使用的任何位置!
最后像使用普通函数那样使用即可
`const position = useMousePosition()
return (
  <div>
    x:{position.x}
    y:{position.y}
  </div>
)
     很明显使代码量减少了
到此这篇关于react中创建自定义hooks的文章就介绍到这了,更多相关react自定义hooks内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!``````
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号