欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 在react当中实现pc端三个点展开操作栏,在移动端长按展开操作栏。

在react当中实现pc端三个点展开操作栏,在移动端长按展开操作栏。

2025/4/9 12:57:30 来源:https://blog.csdn.net/qq_70005974/article/details/146932843  浏览:    关键词:在react当中实现pc端三个点展开操作栏,在移动端长按展开操作栏。

实现思路:
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.currenttimerRefcurrent 属性,用于存储 setTimeout 的返回值

代码实现四:释放鼠标

  const handlePressEnd = () => {if (timerRef.current) {clearTimeout(timerRef.current); // 清除定时器timerRef.current = null; // 重置为 null}};

代码实现五:组件卸载时清除定时器

useEffect(() => {return () => {if (timerRef.current) {clearTimeout(timerRef.current);}};}, []);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词