实现思路:
1.首先判断是否是在pc端还是在移动端。(使用window.matchMedia函数)是否显示三个点
2.使用onMouseDown时触发计时器开始计时,在规定时间内没有释放鼠标左键就触发相关事件。
3.使用onMouseUp判断是否在规定的时间内释放鼠标则清除定时器。
4.组件卸载时清楚计时器。
代码实现一:
使用媒体查询(window.matchMedia)定义变量(mediaQuery)获取当前屏幕宽度,如果大于430px就返回true反之返回false。
const mediaQuery = window.matchMedia('(max-width: 430px)');
渲染到页面上:
使用条件渲染{!mediaQuery.matches && <p>我是三个点组件</P>}:
◦ {} 是 JSX 中的表达式包裹符,表示在 JSX 中嵌入 JavaScript 代码。
◦ !mediaQuery.matches 是一个条件判断,表示对 mediaQuery.matches 取反。
◦ && 是逻辑与运算符,在这里的作用是:如果左边的表达式为 true,则渲染右边的 JSX 内容;如果左边为 false,则不渲染任何内容。
注释:
-
matches
是一个布尔值,表示当前的媒体查询条件是否匹配。
{!mediaQuery.matches && <p>我是三个点组件</P>}
代码实现二:
onMouseDown时传递dom元素和相关的数据,在react中函数组件的返回值是必须的,因为 React 需要知道要渲染什么内容到 DOM 中,我使用箭头函数,其中的e是传递的dom元素,conversation是传递的数据。
onMouseDown={(e) =>handlePressStart(e, conversation)}
这个事件是实现清除定时器
onMouseUp={handlePressEnd}
代码实现三:处理按下事件
当按下鼠标键是,则开始进行计时,如果在规定时间内没有抬起鼠标则触发相关事件反之则清除定时器,以防污染。
定义变量存储定时器
const timerRef = useRef<NodeJS.Timeout | null>(null); // 明确定义类型
useRef 是 React 提供的一个 Hook,用于创建一个可变的引用值(ref)。
• timerRef 是一个 ref 对象,它的 current 属性可以存储任何值。
• NodeJS.Timeout 是 setTimeout 的返回值类型,表示一个定时器的标识符。
• null 表示初始值为 null,表示定时器尚未创建。
/ 处理按下事件const handlePressStart = (event: React.MouseEvent<HTMLDivElement> | any,conversation: IConversation) => {if (!mediaQuery.matches) {return;}timerRef.current = setTimeout(() => {// 获取元素setAnchorEl(event.target as HTMLElement);setSelectConversationId(conversation.id);setSelectConversationTitle(conversation.conversationTitle || conversation.agentName || '');setSelectConversation(conversation);}, longPressThreshold);};
//longPressThreshold是定义的一个数字,也可以直接在setTimeout是设置时间
timerRef.current
是 timerRef
的 current
属性,用于存储 setTimeout
的返回值
代码实现四:释放鼠标
const handlePressEnd = () => {if (timerRef.current) {clearTimeout(timerRef.current); // 清除定时器timerRef.current = null; // 重置为 null}};
代码实现五:组件卸载时清除定时器
useEffect(() => {return () => {if (timerRef.current) {clearTimeout(timerRef.current);}};}, []);