ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Quasar QSlideItem 组件完全指南:从左右滑动操作到源码级原理剖析

Quasar QSlideItem 组件完全指南:从左右滑动操作到源码级原理剖析 Quasar QSlideItem 组件完全指南从左右滑动操作到源码级原理剖析【免费下载链接】quasarQuasar Framework - Build high-performance VueJS user interfaces in record time项目地址: https://gitcode.com/gh_mirrors/qu/quasarQSlideItem 是 Quasar Framework 中用于实现滑动即操作交互的列表项组件本质上是在 QItem 基础上扩展了left与right乃至top、bottom插槽让用户通过鼠标拖拽或触屏手指滑动即可触发指定动作。本文以官方文档 slide-item.md 为主体结合 QSlideItem.js 源码与 5 个官方示例完整覆盖其 API、四向滑动、自定义颜色、滑动过程动态定制、单侧布局与无障碍要求帮助你直接上手并理解其底层手势判定逻辑。组件定位QItem 之上的滑动动作层官方文档开篇即给出定义QSlideItem 本质上就是一个 QItem只是额外增加了两个插槽left和right允许用户将条目拖向某一侧来执行特定动作。换言之它继承了 QItem 的一切布局与语义能力同时叠加了一层滑动揭示操作区的交互。与之相关的组件还包括 QExpansionItem展开式列表项与 QMenu菜单可在无障碍场景中承载等价操作它们共同构成了 Quasar 列表交互的完整工具箱。从源码看组件在 QSlideItem.js 中通过createComponent注册props 只声明了四个方向颜色与dark继承自useDarkProps事件则固定为action、top、right、bottom、left五个——这种少 props、多插槽、事件驱动的设计正是滑动操作组件的典型架构。API 速览Props、Slots、Events 与 Methods组件完整的类型与参数定义见官方 JSON 描述文件 QSlideItem.json核心契约如下Props属性属性名类型说明left-colorString左侧滑动区背景色取值来自 Quasar Color Palette如red、primary、amberright-colorString右侧滑动区背景色top-colorString顶部滑动区背景色bottom-colorString底部滑动区背景色darkBoolean是否启用暗色模式样式四个颜色属性均继承自统一的color基础定义category 为 style意味着你可以传入任何 Quasar 调色板颜色名组件会拼接出bg-color类。Slots插槽插槽名说明default条目主体内容所在位置官方建议使用 QItemSection 组织left向左滑动时揭示的左侧内容right向右滑动时揭示的右侧内容top向上滑动时揭示的顶部内容bottom向下滑动时揭示的底部内容注意只有定义了对应插槽的方向才可滑动未定义插槽的方向源码中会在手势阶段直接将位移归零见下文原理分析。Events事件事件名触发时机回调参数left/right/top/bottom用户完成向该方向的滑动滑动距离达标后{ reset }reset为函数调用后将组件复位到未滑动状态slide滑动过程中持续触发{ side, ratio, isReset }side为left | right | top | bottomratio为 0~1 的进度比例isReset为布尔值表示比例是否已复位action用户完成向任意一侧的滑动{ side, reset }side指明生效方向reset为复位函数Methods方法方法名说明reset将组件复位到初始未滑动状态。源码中通过Object.assign(proxy, { reset })暴露为公开方法可在模板中用 ref 调用基础用法横向左右滑动最基本的场景是左右两个方向各揭示一个操作区。官方示例 Basic.vue 展示了三种内容组合——纯图标、纯文本、图标加文本template div classq-pa-md stylemax-width: 350px q-list bordered separator q-slide-item leftonLeft rightonRight template #left q-icon namedone / /template template #right q-icon namealarm / /template q-item q-item-section avatar q-avatar colorprimary text-colorwhite iconbluetooth / /q-item-section q-item-sectionIcons only/q-item-section /q-item /q-slide-item /q-list /div /template script setup import { useQuasar } from quasar import { onBeforeUnmount } from vue const $q useQuasar() let timer function finalize(reset) { timer setTimeout(() { reset() }, 1000) } onBeforeUnmount(() { clearTimeout(timer) }) function onLeft({ reset }) { $q.notify(Left action triggered. Resetting in 1 second.) finalize(reset) } function onRight({ reset }) { $q.notify(Right action triggered. Resetting in 1 second.) finalize(reset) } /script几个关键实战要点事件回调解构reset四个方向事件left/right/top/bottom和action事件都会传入reset函数。滑动触发动作后组件会停留在揭示状态必须调用reset()才能归位。示例中用setTimeout延迟 1 秒自动复位并用onBeforeUnmount清理定时器避免组件卸载后仍执行回调。内容中的图片需禁用原生拖拽文档特别提示若条目内容包含图片应为其添加draggablefalse否则浏览器原生图片拖拽行为会干扰滑动手势。官方所有示例的img都遵循了这一约定。滑动区内容推荐使用row items-center包装从示例可见左侧/右侧插槽内容通常配合q-icon与文字用 flex 布局保证垂直居中。垂直滑动top / bottom 方向QSlideItem 不仅支持水平方向还支持垂直方向的上下滑动。官方示例 Vertical.vue 展示了一个 150px 高条目的上下滑动template div classq-pa-md stylemax-width: 220px q-list bordered separator q-slide-item toponTop bottomonBottom template #top q-icon namelink / /template template #bottom q-icon namelink_off / /template q-item styleheight: 150px q-item-section avatar q-avatar colorprimary text-colorwhite iconfingerprint / /q-item-section q-item-sectionSlide vertically/q-item-section /q-item /q-slide-item /q-list /div /template与横向用法完全对称定义top/bottom插槽并监听对应事件即可。从源码看垂直与水平的判定是在手势开始时就确定轴向pan.axis一旦确定为 Y 轴后续位移只按offset.y计算方向不会中途切换轴向。自定义颜色为每个方向赋予语义色通过left-color/right-color/top-color/bottom-color四个 props可以为滑动操作区设置任意 Quasar 调色板颜色用色彩传达动作语义例如红色代表删除、绿色代表完成。官方示例 CustomColors.vueq-slide-item leftonLeft rightonRight left-colorred right-colorpurple template #left div classrow items-center q-icon left namedone / Left /div /template template #right div classrow items-center Right content.. long q-icon right namealarm / /div /template q-item q-item-section avatar q-icon colorprimary namecell_wifi / /q-item-section q-item-sectionCustom colors (red, purple)/q-item-section /q-item /q-slide-item默认情况下四个方向的操作区背景色由 QSlideItem.sass 定义left 为绿色、right 为橙色、top 为蓝色、bottom 为紫色字体颜色统一为白色。传入颜色 props 后源码会在对应方向容器的 class 上追加bg-color见 QSlideItem.js覆盖默认主题色。滑动过程实时定制slide 事件与 ratio如果希望在滑动过程中动态改变样式比如滑动越深、颜色越浓需要监听slide事件。该事件在每次手势位移时触发回调携带{ side, ratio, isReset }side当前生效方向ratio已完成滑动比例范围 0未滑动到 1完全滑开由源码Math.max(0, Math.min(1, (dist - 40) / pan.size[showing]))计算得出isReset为true表示比例已被复位手指松开且未达标或调用了 reset。官方示例 CustomizeSlide.vue 利用ratio动态计算左右操作区的颜色深浅script setup import { computed, ref } from vue const slideRatio ref({ left: 0, right: 0 }) const leftColor computed(() slideRatio.value.left 1 ? red-10 : red- (3 Math.round(Math.min(3, slideRatio.value.left * 3))) ) const rightColor computed(() slideRatio.value.right 1 ? green-10 : green- (3 Math.round(Math.min(3, slideRatio.value.right * 3))) ) function onSlide({ side, ratio, isReset }) { clearTimeout(timer) timer setTimeout( () { slideRatio.value[side] ratio }, isReset ? 200 : void 0 ) } /scriptq-slide-item :left-colorleftColor :right-colorrightColor leftonLeft rightonRight slideonSlide template #left Left /template template #right Right content.. long /template q-item.../q-item /q-slide-item这里leftColor是一个根据slideRatio.left在red-3到red-10之间渐变取值的 computed 属性实现了滑得越深颜色越重的反馈效果isReset为真时用 200ms 延迟把比例归零保证复位过程也有平滑过渡。单侧或无操作方向OneSided 场景并非每个条目都需要左右两个方向的操作。官方示例 OneSided.vue 展示了三种情况只有左侧操作、只有右侧操作、完全没有操作!-- 只定义 left 插槽仅向左可滑动 -- q-slide-item leftonLeft rightonRight template #left q-icon namedone / /template q-item...Only left action.../q-item /q-slide-item !-- 只定义 right 插槽仅向右可滑动 -- q-slide-item leftonLeft rightonRight template #right q-icon namealarm / /template q-item...Only right action.../q-item /q-slide-item !-- 不定义任何滑动插槽退化为普通条目 -- q-slide-item leftonLeft rightonRight q-item...No actions.../q-item /q-slide-item从源码 QSlideItem.js 可以确认这一行为当手势方向对应的插槽未定义时slots.left void 0等组件直接执行transform: translate(0,0)并 return手势不会产生任何位移。同时渲染层会计算实际存在的方向列表dirs仅当dirs.length 0时完全跳过 TouchPan 手势指令的绑定QSlideItem.js此时组件从交互层面退化为一个普通列表项。源码级原理剖析TouchPan 与手势判定算法理解了使用层面再看 QSlideItem.js 的核心实现可以更准确地预判组件行为1. 手势依赖 TouchPan 指令。组件引入 Quasar 的TouchPan指令源码路径 TouchPan.js并通过withDirectives以缓存方式绑定到内容节点上修饰符固定为prevent、stop、mouse加上实际方向QSlideItem.js。mouse: true意味着桌面端鼠标拖拽同样可用这正是鼠标或手指皆可滑动的底层来源。2. 方向插槽元数据。顶部定义的slotsDef数组QSlideItem.js描述了每个方向的布局参数const slotsDef [ [left, center, start, width], [right, center, end, width], [top, start, center, height], [bottom, end, center, height] ]其中第二、三项分别用于生成items-align与justify-align定位类第四项width/height则是测量滑动区尺寸用的getBoundingClientRect()属性——这决定了滑动达标所需的位移基准。3. 滑动进度算法。手势开始evt.isFirst时先测量各方向操作区尺寸并锁定轴向位移过程中按pan.scale clamp((dist - 40) / size, 0, 1)计算比例QSlideItem.js。40 是内置的起始阈值位移不足 40px 时比例始终为 0操作区保持隐藏避免轻微抖动误触。4. 触发与 230ms 延迟。手势结束evt.isFinal时若pan.scale 1完全滑开节点平移 100% 后延迟 230ms才依次emit方向事件与action事件QSlideItem.js若未达 1则复位位移并触发slide事件且isReset: true。因此方向事件和action事件几乎同时触发但都发生在用户松手之后的确认阶段。5. RTL 支持。组件通过$q.lang.rtl判断语言方向QSlideItem.js在 RTL 语言下left与right的映射自动互换保证滑动方向与阅读方向一致。6. 过渡动画。内容层的位移动画由 QSlideItem.sass 的.q-slide-item__content控制transition: transform .2s ease-in并在手势过程中动态添加/移除no-transition类实现跟手实时位移、松手平滑归位的体验user-select: none则避免拖拽时选中文本。无障碍滑动必须只是便捷方式而非唯一入口官方文档在 Accessibility 一节标注 v2.25 起给出了明确的警告滑动手势仅支持指针操作——没有键盘交互也没有任何辅助技术路径可以触发它。这意味着屏幕阅读器用户、纯键盘用户无法通过滑动触发任何绑定在滑动事件上的行为因此任何通过 QSlideItem 滑动实现的动作如删除、收藏、标记已读都必须同时提供等价的替代入口——例如条目上的可见按钮或一个包含相同命令的 QMenu滑动手势应始终被视为便捷操作而非唯一操作路径。这一要求来自 Quasar 对 Web 可访问性的整体承诺在实现滑动交互时务必作为硬性设计约束落实。最佳实践小结内容中的图片务必加draggablefalse否则原生图片拖拽会干扰手势事件回调里记得调用reset()否则条目会停留在滑动揭示状态若用定时器延迟复位务必在onBeforeUnmount中清理只为需要操作的方向定义插槽未定义方向会自动禁用组件也会跳过手势指令绑定用颜色 props 表达动作语义并结合slide事件与ratio实现滑动越深反馈越强的动态效果始终提供非手势的等价操作入口可见按钮或菜单满足键盘与屏幕阅读器用户想要程序化复位时可通过模板 ref 调用组件暴露的reset方法。QSlideItem 的完整 API 细节可在 QSlideItem.json 中查阅5 个官方示例源码分别位于 docs/src/examples/QSlideItem/ 目录下可直接复制到项目中验证上述所有行为。【免费下载链接】quasarQuasar Framework - Build high-performance VueJS user interfaces in record time项目地址: https://gitcode.com/gh_mirrors/qu/quasar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表