HarmonyOS ArkUI之自定义组件侧滑菜单(JS)

2025-05-29 0 56

HarmonyOS ArkUI之自定义组件侧滑菜单(JS)

前言

鸿蒙这次API7更新除了新增TS声明式开发之外,还有JS开发也增加了很多API,JS开发自定义组件越来越方便了。

本项目基于ArkUI中JS扩展的类Web开发范式,关于语法和概念直接看官网官方文档地址:

基于JS扩展的类Web开发范式1 基于JS扩展的类Web开发范式2

本文介绍最新出的插槽用法,实现侧滑菜单、支持两种风格、支持快速滑动打开关闭。

ArKUI系列文章

效果演示

风格一:内容页在菜单上面风格二:内容页在菜单下面

HarmonyOS ArkUI之自定义组件侧滑菜单(JS)HarmonyOS ArkUI之自定义组件侧滑菜单(JS)

主要知识点

触摸事件、自定义组件父子组件传递参数、api=7新出的slot插槽

实现思路

自定义组件的逻辑都在此目录下:entry/js/default/pages/drawer

主要使用onTouch相关事件,滑动改变菜单布局或内容布局的left偏移量,手指抬起使用动画完成偏移量

1、onTouch相关事件

只贴出了关键代码

  1. /**
  2. * 触摸按下
  3. */
  4. onTouchStart(event) {
  5. // 记录首次按下的x坐标
  6. this.pressX = event.touches[0].localX
  7. // 记录上次的x坐标
  8. this.lastX = this.pressX
  9. …..
  10. },
  11. /**
  12. * 触摸移动
  13. */
  14. onTouchMove(event) {
  15. // 当前x坐标
  16. let localX = event.touches[0].localX
  17. // 计算与上次的x坐标的偏移量
  18. let offsetX = this.lastX – localX;
  19. // 记录上次的x坐标
  20. this.lastX = localX
  21. // 累计偏移量
  22. this.offsetLeft -= offsetX
  23. // 设置偏移量的范围
  24. …..
  25. }
  26. **
  27. * 触摸抬起
  28. */
  29. onTouchEnd(event) {
  30. ……
  31. // 手指抬起,根据情况,判断toX的值,也就是判断关闭或开启菜单的情况
  32. // 当移动偏移量大于菜单一半宽度,完全打开菜单,否则反之
  33. if (this.offsetLeft > this.menuWidth / 2) {
  34. toX = this.menuWidth
  35. } else {
  36. toX = 0
  37. }
  38. ……
  39. // 开启动画
  40. this.startAnimator(toX)
  41. }
  42. /**
  43. * 开启动画
  44. */
  45. startAnimator(toX) {
  46. // 设置动画参数
  47. let options = {
  48. duration: ANIMATOR_DURATION, // 持续时长
  49. fill: 'forwards', // 启停模式:保留在动画结束状态
  50. begin: this.offsetLeft, // 起始值
  51. end: toX // 结束值
  52. };
  53. // 更新动画参数
  54. this.animator.update(options)
  55. // 监听动画值变化事件
  56. this.animator.onframe = (value) => {
  57. this.offsetLeft = value
  58. this.changeMenuOffsetLeft()
  59. }
  60. // 开启动画
  61. this.animator.play()
  62. },

2、showStyle

0 第一种样式下,解决设置z-index之后菜单界面在内容下面,但点击事件却还在内容上面的问题。

初始化设置left偏移量

动画结束,判断菜单是否关闭,关闭直接设置菜单偏移量为负的菜单宽度

注意:目前使用插槽之后,预览器不走生命周期方法:onShow。

  1. export default {
  2. // 使用外部传入
  3. props: ['showStyle'],// 显示样式:0菜单在下面,1菜单在上面
  4. ……
  5. }
  6. **
  7. * 界面显示
  8. */
  9. onShow() {
  10. …..
  11. // 设置菜单偏移量为负的菜单宽度,为了解决z-index设置后,菜单界面到内容下面,
  12. // 事件还停留到内容上面,导致点击菜单区域,响应的还是菜单点击事件
  13. this.menuOffsetLeft = -this.menuWidth
  14. }

3、使用具名插槽封装

  1. "drawer-container" class="drawer-container" on:touchstart="onTouchStart"
  2. on:touchmove="onTouchMove" on:touchend="onTouchEnd">
  3. "drawer-content" style="left : {{ showStyle == 0 ? offsetLeft : 0 }} px;
  4. z-index : {{ zIndexContent }};" on:click="closeMenu">
  5. <!––具名插槽,根据名称加入对应的插槽中–>
  6. name="content">
  7. "drawer-menu" style="z-index : {{ zIndexMenu }};">
  8. "drawer-menu-background" style="opacity : {{ menuBgOpacity }};">
  9. left : {{ menuOffsetLeft }} px;" on:click="clickMenu">
  10. <!––具名插槽,根据名称加入对应的插槽中–>
  11. name="menu">

4、index页面使用

  1. <!––引入自定义组件–>
  2. name='drawer' src='../drawer/drawer.hml'>
  3. "container">
  4. <!––通过传值设置样式–>
  5. "0">
  6. <!––根据名称加入对应的插槽中–>
  7. 'content' class="content-layout">
  8. "title-bar">
  9. 主页
  10. "mainpage-content">
  11. "content1">我是内容页面
  12. "content2">V1.0.0
  13. "content2">梁迪迪
  14. 'menu' class="menu-layout">
  15. "my-info">
  16. HarmonyOS ArkUI之自定义组件侧滑菜单(JS)"common/images/head_photo.png">
  17. 登录 | 注册
  18. "menu-content">
  19. for="{{ listMenu }}" tid="{{ $item.id }}" on:click="menuSkip({{ $item.name }})">
  20. HarmonyOS ArkUI之自定义组件侧滑菜单(JS)"{{ $item.icon }}">
  21. {{ $item.name }}

结尾

每天进步一点点、需要付出努力亿点点。

原文链接:https://harmonyos.51cto.com

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 HarmonyOS ArkUI之自定义组件侧滑菜单(JS) https://www.kuaiidc.com/90753.html

相关文章

发表评论
暂无评论