Skip to content

指令集:v-copy / v-debounce / v-longpress / v-context-menu ​

组件库内置四个高频指令,app.use(Vue3EpBizLib) 时随 bizDirectivesPlugin 批量注册;按需导入时也可单独 app.directive('copy', vCopy)。与既有 v-auth(权限指令,随 BizAuthButton 导出)互补。

v-copy 点击复制 ​

vue
<template>
  <!-- 点击复制,成功 ElMessage 提示 -->
  <el-button v-copy="orderNo">复制单号</el-button>

  <!-- 静默复制(不弹提示) -->
  <span v-copy.silent="token">token</span>
</template>

v-debounce 点击防抖 ​

冷却式防抖:执行一次后冷却期内忽略后续点击(提交 / 查询按钮防连点)。

vue
<template>
  <el-button type="primary" v-debounce="save">保存</el-button>

  <!-- 自定义冷却间隔 -->
  <el-button v-debounce="{ handler: search, delay: 500 }">搜索</el-button>
</template>

v-longpress 长按触发 ​

按住达到时长触发一次(默认 500ms),抬起 / 移出 / 取消即中止;按压等待期间抑制右键菜单。

vue
<template>
  <div v-longpress="startRecord">按住说话</div>
  <div v-longpress="{ handler: showActions, duration: 800 }">长按 800ms 弹出操作</div>
</template>

v-context-menu 右键菜单 ​

宿主元素右键弹出 BizContextMenu;传函数时弹出瞬间求值,菜单项可随宿主数据动态生成。

vue
<script setup lang="ts">
import type { BizContextMenuItem } from 'vue3-ep-biz-lib'

const items: BizContextMenuItem[] = [
  { key: 'refresh', label: '刷新' },
  { key: 'delete', label: '删除', danger: true, divided: true },
]
</script>

<template>
  <tr v-context-menu="items">...</tr>
  <tr v-context-menu="() => menuOf(row)">...</tr>
</template>

注册方式 ​

ts
// 全量(app.use 已含指令注册)
import Vue3EpBizLib from 'vue3-ep-biz-lib'
app.use(Vue3EpBizLib)

// 按需
import { vCopy, vDebounce, vLongpress, vContextMenu } from 'vue3-ep-biz-lib'
app.directive('copy', vCopy)
app.directive('debounce', vDebounce)
app.directive('longpress', vLongpress)
app.directive('context-menu', vContextMenu)