教你在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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解使用create-react-app添加css modules、sasss和antd
这篇文章主要介绍了详解使用create-react-app添加css modules、sasss和antd,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-07-07
React函数式组件Hook中的useEffect函数的详细解析
useEffect是react v16.8新引入的特性。我们可以把useEffect hook看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三个函数的组合2022-10-10
详解react-router 4.0 下服务器如何配合BrowserRouter
这篇文章主要介绍了详解react-router 4.0 下服务器如何配合BrowserRouter,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-12-12


最新评论