Skip to content

一、自定义防抖函数指令

在directive/index.js中新建

js
import Vue from 'vue';
/***
        * 防抖 单位时间只触发最后一次
        *  @param {?Number|300} time - 间隔时间
        *  @param {Function} fn - 执行事件
        *  @param {?String|"click"} event - 事件类型 例:"click"
        *  @param {Array} binding.value - [fn,event,time]
        *  例:<el-button v-debounce="[reset,`click`,300]">刷新</el-button>
        *  也可简写成:<el-button v-debounce="[reset]">刷新</el-button>
 */
Vue.directive('debounce', {
    inserted: function(el, binding) {
        let [fn, time = 300] = binding.value
        let timer
        el.addEventListener('click', event => {
            timer && clearTimeout(timer)
            timer = setTimeout(() => fn(), time)
        }, true)
    }
})
// 使用 指令是数组,第一个参数为方法名,第二个可以为时间
<el-button type="primary" id="searchBtn" v-debounce="[nextStep]">下一步</el-button>

二、自定义节流函数

js
import Vue from 'vue';

Vue.directive('throttle', {
    inserted: function (el, binding) {
        let [fn, event = "click", time = 1300] = binding.value
        let timer, timer_end;
        el.addEventListener(event, () => {
            if (timer) {
                clearTimeout(timer_end);
                return timer_end = setTimeout(() => fn(), time);
            }
            fn();
            timer = setTimeout(() => timer = null, time)
        })
    }
})

三、自定义水印

js
Vue.directive('waterMarker', {
    bind: function(el, binding) {
        let str = binding.value.text || '大医云版权所有'
        let parentNode = el
        let font = binding.value.font
        let textColor = binding.value.textColor
        // 水印文字,父元素,字体,文字颜色
        var can = document.createElement('canvas')
        parentNode.appendChild(can)
        can.width = 200
        can.height = 150
        can.style.display = 'none'
        var cans = can.getContext('2d')
        cans.rotate((-20 * Math.PI) / 180)
        cans.font = font || '16px Microsoft JhengHei'
        cans.fillStyle = textColor || 'rgba(180, 180, 180, 0.3)'
        cans.textAlign = 'left'
        cans.textBaseline = 'Middle'
        cans.fillText(str, can.width / 10, can.height / 2)
        parentNode.style.backgroundImage = 'url(' + can.toDataURL('image/png') + ')'
    }
})

四、在main.js中导入

js
import './directive/index'

Released under the MIT License.