点击按钮持续增加/减少

微信截图_20211010223715.png

  1. <span
  2. class="el-input-number__decrease"
  3. role="button"
  4. v-if="controls"
  5. v-repeat-click="decrease"
  6. :class="{'is-disabled': minDisabled}"
  7. @keydown.enter="decrease">
  8. <i :class="`el-icon-${controlsAtRight ? 'arrow-down' : 'minus'}`"></i>
  9. </span>

使用自定义指令(directives)来控制点击事件 v-repeat-click="decrease"

  1. import RepeatClick from 'element-ui/src/directives/repeat-click';
  2. directives: {
  3. repeatClick: RepeatClick
  4. }
  1. import { once, on } from 'element-ui/src/utils/dom';
  2. export default {
  3. // 初始化调用一次,给元素绑定事件
  4. // el:可操作的 dom
  5. // binding:一个对象,包含指令上的很多信息
  6. // vnode:虚拟节点
  7. bind(el, binding, vnode) {
  8. let interval = null;
  9. let startTime;
  10. // context:Component 类型的数据结构,即该 vnode 所在的组件上下文
  11. // binding.expression 相当于上面的 v-repeat-click="decrease" 中的 decrease 方法
  12. const handler = () => vnode.context[binding.expression].apply();
  13. const clear = () => {
  14. if (Date.now() - startTime < 100) {
  15. handler();
  16. }
  17. clearInterval(interval);
  18. interval = null;
  19. };
  20. on(el, 'mousedown', (e) => {
  21. if (e.button !== 0) return;
  22. startTime = Date.now();
  23. // 鼠标抬起时销毁定时器
  24. // 在 document 上绑定事件,这样能避免在按下鼠标后移动到按扭外再放开鼠标 mouseup 事件不响应
  25. once(document, 'mouseup', clear);
  26. clearInterval(interval);
  27. interval = setInterval(handler, 100);
  28. });
  29. }
  30. };
  1. export const on = (function() {
  2. // 通过判断处理兼容性问题
  3. if (!isServer && document.addEventListener) {
  4. return function(element, event, handler) {
  5. if (element && event && handler) {
  6. element.addEventListener(event, handler, false);
  7. }
  8. };
  9. } else {
  10. return function(element, event, handler) {
  11. if (element && event && handler) {
  12. element.attachEvent('on' + event, handler);
  13. }
  14. };
  15. }
  16. })();
  17. export const off = (function() {
  18. if (!isServer && document.removeEventListener) {
  19. return function(element, event, handler) {
  20. if (element && event) {
  21. element.removeEventListener(event, handler, false);
  22. }
  23. };
  24. } else {
  25. return function(element, event, handler) {
  26. if (element && event) {
  27. element.detachEvent('on' + event, handler);
  28. }
  29. };
  30. }
  31. })();
  32. export const once = function(el, event, fn) {
  33. var listener = function() {
  34. if (fn) {
  35. fn.apply(this, arguments);
  36. }
  37. off(el, event, listener);
  38. };
  39. on(el, event, listener);
  40. };