zoukankan      html  css  js  c++  java
  • vue3 自定义指令(简易版防抖、节流)


    /*
     * @Descripttion: 自定义指令
     * @version:
     */
    export const direcitiveFUc = (app: any) => {
        /*
        * @Descripttion: 防抖,单位时间内触发最后一次
        * @param [function] func --执行事件
        * @param [?number|300] wait = 300 -- 时间间隔
        * @param [?string|"click"] event -- 事件类型
        * @param [?boolean|true] boolean -- 事件冒泡-false , 事件捕获--true
        * @param [Array] binding.value - [func,type,wait,true]  
        * <a-button v-debounce="[test,'click',1000,true]">防抖测试</a-button>
        */
        app.directive('debounce', {
            beforeMount(el: any, binding: any) {
                let [
                    func,
                    type = 'click',
                    wait = 300,
                    immediate = true
                ] = binding.value;
                let timer: any
                el.$type = type;
                el.$handle = () => {
                    timer && clearTimeout(timer)
                    timer = setTimeout(() => func(), wait)
                }
                el.addEventListener(el.$type, el.$handle, immediate);
            },
            unmounted(el: any) {
                el.removeEventListener(el.$type, el.$handle);
            }
        })

        /*
        * @Descripttion: 节流,单位时间内可触发一次
        * @param [function] func --执行事件
        * @param [?number|300] wait = 300 -- 时间间隔
        * @param [?string|"click"] event -- 事件类型
        * @param [?boolean|true] boolean -- 事件冒泡-false , 事件捕获--true
        * @param [Array] binding.value - [func,type,wait,true]  
        * <a-button v-debounce="[throttle,'click',1000,true]">防抖测试</a-button>
        */
        app.directive('throttle', {
            beforeMount(el: any, binding: any) {
                let [
                    func,
                    type = 'click',
                    wait = 300,
                    immediate = true
                ] = binding.value;
                let timer: any, timer_end: any
                el.$type = type;
                el.$handle = () => {
                    if (timer) {
                        clearTimeout(timer_end)
                        return timer_end = setTimeout(() => func, wait)
                    }
                    func()
                    timer = setTimeout(() => null, wait);
                }
                el.addEventListener(el.$type, el.$handle, immediate);
            },
            unmounted(el: any) {
                el.removeEventListener(el.$type, el.$handle);
            }
        })
    }
    // 使用 在main.ts 中导入
    import { direcitiveFUc } from './directives/index'
    const app = createApp(App);
    direcitiveFUc(app)
    app.mount('#app');
     
    //页面使用 列:<a-button v-debounce="[test,'click',1000,true]">防抖测试</a-button>
  • 相关阅读:
    Vue 项目启动抛出 Error/ No PostCSS Config found in
    js sort排序
    layui table合计但是未计算的解决
    vue项目echarts画布删除历史数据重新渲染数据
    layui 数据返回但是table表格未渲染出来的问题
    Spring Boot实践——AOP实现
    IntelliJ IDEA—IDEA2018.1激活方式
    Spring Boot实践——统一异常处理
    Spring Boot实践——Filter实现
    Spring Boot实践——三种拦截器的创建
  • 原文地址:https://www.cnblogs.com/wenqylh/p/15553037.html
Copyright © 2011-2022 走看看