directives.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import { message } from "@/utils/message";
  4. defineOptions({
  5. name: "Directives"
  6. });
  7. const search = ref("");
  8. const searchTwo = ref("");
  9. const searchThree = ref("");
  10. const searchFour = ref("");
  11. const searchFive = ref("");
  12. const searchSix = ref("copy");
  13. const text = ref("可复制的文本");
  14. const long = ref(false);
  15. const cbText = ref("");
  16. const idx = ref(0);
  17. function onInput() {
  18. message(search.value);
  19. }
  20. function onInputTwo() {
  21. message(searchTwo.value);
  22. }
  23. function onInputThree({ name, sex }) {
  24. message(`${name}${sex}${searchThree.value}`);
  25. }
  26. function onInputFour() {
  27. message(searchFour.value);
  28. }
  29. function onInputFive({ name, sex }) {
  30. message(`${name}${sex}${searchFive.value}`);
  31. }
  32. function onLongpress() {
  33. long.value = true;
  34. }
  35. function onCustomLongpress() {
  36. long.value = true;
  37. }
  38. function onCbLongpress() {
  39. idx.value += 1;
  40. long.value = true;
  41. cbText.value = `持续回调${idx.value}次`;
  42. }
  43. function onReset() {
  44. long.value = false;
  45. cbText.value = "";
  46. idx.value = 0;
  47. }
  48. </script>
  49. <template>
  50. <el-card shadow="never">
  51. <template #header>
  52. <div class="card-header">
  53. <p class="font-medium">自定义防抖、截流、文本复制、长按指令</p>
  54. <el-link
  55. class="mt-2"
  56. href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/directives.vue"
  57. target="_blank"
  58. >
  59. 代码位置 src/views/able/directives.vue
  60. </el-link>
  61. </div>
  62. </template>
  63. <div class="mb-2">
  64. 防抖指令(连续输入,只会执行第一次点击事件,立即执行)
  65. <el-input
  66. v-model="search"
  67. v-optimize="{
  68. event: 'input',
  69. fn: onInput,
  70. immediate: true,
  71. timeout: 1000
  72. }"
  73. class="w-[200px]!"
  74. clearable
  75. @clear="onInput"
  76. />
  77. </div>
  78. <div class="mb-2">
  79. 防抖指令(连续输入,只会执行最后一次事件,延后执行)
  80. <el-input
  81. v-model="searchTwo"
  82. v-optimize="{ event: 'input', fn: onInputTwo, timeout: 400 }"
  83. class="w-[200px]!"
  84. clearable
  85. />
  86. </div>
  87. <div>
  88. 防抖指令(连续输入,只会执行最后一次事件,延后执行,传参用法)
  89. <el-input
  90. v-model="searchThree"
  91. v-optimize="{
  92. event: 'input',
  93. fn: onInputThree,
  94. timeout: 400,
  95. params: { name: '小明', sex: '男' }
  96. }"
  97. class="w-[200px]!"
  98. clearable
  99. />
  100. </div>
  101. <el-divider />
  102. <div class="mb-2">
  103. 节流指令(连续输入,每一秒只会执行一次事件)
  104. <el-input
  105. v-model="searchFour"
  106. v-optimize:throttle="{ event: 'input', fn: onInputFour, timeout: 1000 }"
  107. class="w-[200px]!"
  108. clearable
  109. />
  110. </div>
  111. <div>
  112. 节流指令(连续输入,每一秒只会执行一次事件,传参用法)
  113. <el-input
  114. v-model="searchFive"
  115. v-optimize:throttle="{
  116. event: 'input',
  117. fn: onInputFive,
  118. params: { name: '小明', sex: '男' }
  119. }"
  120. class="w-[200px]!"
  121. clearable
  122. />
  123. </div>
  124. <el-divider />
  125. <div class="mb-2">
  126. 文本复制指令(双击输入框内容即可复制)
  127. <el-input v-model="searchSix" v-copy="searchSix" class="w-[200px]!" />
  128. </div>
  129. <div>
  130. 文本复制指令(自定义触发事件,单击复制)
  131. <span v-copy:click="text" class="text-sky-500">{{ text }}</span>
  132. </div>
  133. <el-divider />
  134. <el-space wrap>
  135. 长按指令
  136. <el-button v-longpress="onLongpress">长按(默认500ms)</el-button>
  137. <el-button v-longpress:1000="onCustomLongpress">
  138. 自定义长按时长(1000ms)
  139. </el-button>
  140. <el-button v-longpress:2000:200="onCbLongpress">
  141. 2秒后每200ms持续回调
  142. </el-button>
  143. <el-button @click="onReset"> 重置状态 </el-button>
  144. <el-tag :type="long ? 'success' : 'info'" class="ml-2" size="large">
  145. {{ long ? "当前为长按状态" : "当前非长按状态" }}
  146. </el-tag>
  147. <el-tag v-if="cbText" type="danger" class="ml-2" size="large">
  148. {{ cbText }}
  149. </el-tag>
  150. </el-space>
  151. </el-card>
  152. </template>