BFE.devAI解答 - React 代码题
6. useHover()
题目描述:
在React中创建一个自定义hook useHover()
,它返回一个包含两个元素的数组 [ref, isHovered]
。其中ref
为传递给需要监视hover状态的元素的引用,isHovered
为表示当前元素是否被悬停的布尔值。
通过上面的代码,使用useHover()
hook来实现一个组件,它可以渲染一个div元素,当div被悬停时,显示'hovered',否则显示'not hovered'。
思路解析:
我们可以使用useRef
钩子来引用元素节点,然后监听元素的mouseEnter
和mouseLeave
事件来设置hover状态,最后返回[ref, isHovered]
。
实现代码:
import React, { useRef, useState, useEffect } from 'react';function useHover() { const [isHovered, setIsHovered] = useState(false); const ref = useRef(null); const handleMouseOver = () => setIsHovered(true); const handleMouseOut = () => setIsHovered(false); useEffect(() => { const node = ref.current; if (node) { node.addEventListener('mouseover', handleMouseOver); node.addEventListener('mouseout', handleMouseOut); return () => { node.removeEventListener('mouseover', handleMouseOver); node.removeEventListener('mouseout', handleMouseOut); }; } }, [ref.current]); return [ref, isHovered];}function App() { const [ref, isHovered] = useHover(); return ( <div ref={ref}> {isHovered ? 'hovered' : 'not hovered'} </div> );}
解释说明:
首先,在useHover
中定义一个ref
,它可以用来获取被监视的元素节点的引用。然后,定义isHovered
状态,它表示元素是否悬停。使用useState
钩子来初始化该状态。接下来,定义handleMouseOver
和handleMouseOut
函数,分别用于设置isHovered
状态为true
或false
。最后通过useEffect
来监听需要监控的元素节点的mouseover
和mouseout
事件,并执行相应的处理函数。在App
组件中,调用useHover
自定义hook,利用返回的ref
和isHovered
更新UI界面。