点击按钮持续增加/减少

<spanclass="el-input-number__decrease"role="button"v-if="controls"v-repeat-click="decrease":class="{'is-disabled': minDisabled}"@keydown.enter="decrease"><i :class="`el-icon-${controlsAtRight ? 'arrow-down' : 'minus'}`"></i></span>
使用自定义指令(directives)来控制点击事件 v-repeat-click="decrease"
import RepeatClick from 'element-ui/src/directives/repeat-click';directives: {repeatClick: RepeatClick}
import { once, on } from 'element-ui/src/utils/dom';export default {// 初始化调用一次,给元素绑定事件// el:可操作的 dom// binding:一个对象,包含指令上的很多信息// vnode:虚拟节点bind(el, binding, vnode) {let interval = null;let startTime;// context:Component 类型的数据结构,即该 vnode 所在的组件上下文// binding.expression 相当于上面的 v-repeat-click="decrease" 中的 decrease 方法const handler = () => vnode.context[binding.expression].apply();const clear = () => {if (Date.now() - startTime < 100) {handler();}clearInterval(interval);interval = null;};on(el, 'mousedown', (e) => {if (e.button !== 0) return;startTime = Date.now();// 鼠标抬起时销毁定时器// 在 document 上绑定事件,这样能避免在按下鼠标后移动到按扭外再放开鼠标 mouseup 事件不响应once(document, 'mouseup', clear);clearInterval(interval);interval = setInterval(handler, 100);});}};
export const on = (function() {// 通过判断处理兼容性问题if (!isServer && document.addEventListener) {return function(element, event, handler) {if (element && event && handler) {element.addEventListener(event, handler, false);}};} else {return function(element, event, handler) {if (element && event && handler) {element.attachEvent('on' + event, handler);}};}})();export const off = (function() {if (!isServer && document.removeEventListener) {return function(element, event, handler) {if (element && event) {element.removeEventListener(event, handler, false);}};} else {return function(element, event, handler) {if (element && event) {element.detachEvent('on' + event, handler);}};}})();export const once = function(el, event, fn) {var listener = function() {if (fn) {fn.apply(this, arguments);}off(el, event, listener);};on(el, event, listener);};
