点击按钮持续增加/减少
<span
class="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);
};