vue3.0自定义指令封装 perfectScroll、防抖、节流

一、定义指令钩子生命周期和钩子参数

1.指令钩子生命周期

在这里插入图片描述

2.指令钩子的钩子参数

在这里插入图片描述

二、定义及使用自定义指令

1 定义指令v-scroll 使用perfectScroll

import {App,Directive} from "vue"
import PerfectScrollbar from 'perfect-scrollbar';
//对应的css
import 'perfect-scrollbar/css/perfect-scrollbar.css';

/**
 *  在使用perfect-scrollbar之前
 应满足以下要求。
 
 容器必须具有position样式。
 容器必须是普通容器元素。

 以下要求包含在基本CSS中,但是当您想更改CSS文件时请记住。
 容器必须具有overflow: hidden   css样式。
 滚动条的位置必须是absolute。
 scrollbar-x必须有bottom或top,而scrollbar-y必须有right或left。
 */
 const el_scrollBar = (el:any) => {
  if (el._ps_ instanceof PerfectScrollbar) {
    el._ps_.update(); // 此时 el._ps_  已经存在update()方法 原型链查找
  } else {
    el._ps_ = new PerfectScrollbar(el, {
      // 对象中传入配置项
      // suppressScrollX: false, //当设置为true时,X轴上的滚动条将不可用,无论内容宽度如何。
      //suppressScrollY :false, //当设置为true时,Y轴上的滚动条将不可用,无论内容宽度如何。
      // wheelSpeed:1, // 应用于鼠标的滚动速度
      // wheelPropagation: false, //当设置为true时,滚动到达边的末端时,鼠标滚轮事件将被传播到父元素。
      // swipeEasing:true , // 当设置为true时,滑动滚动将是缓动动画
      // minScrollbarLength :null, // 当设置为整数值时,滚动条的拇指部分将不会缩小到该像素数以下。
      // maxScrollbarLength :null, // 当设置为整数值时,滚动条的拇指部分将不会超过到该像素数。
      // scrollingThreshold :1000, // 设置鼠标在悬停时停留的时间,单位为毫秒数。
      // scrollXMarginOffset :0, //在不启用X轴滚动条的情况下,内容宽度的像素数可以超过容器宽度。允许一些“摆动空间”或“偏移中断”,这样X轴滚动条就不会因为几个像素而被启用。
      // scrollYMarginOffset: 0, // 在不启用Y轴滚动条的情况下,内容高度的像素数可以超过容器高度。允许一些“摆动空间”或“偏移中断”,这样Y轴滚动条就不会因为几个像素而被启用。
    })
  }
}
 export default function scrollbarDirective(Vue:App) {
  const scrollbarDirective:Directive<HTMLElement> = {
    mounted(el:HTMLElement) {
      const rules = ['fixed', 'absolute', 'relative', 'sticky'];
      if (!rules.includes(window.getComputedStyle(el, null).position)) {
        console.error(
          `perfect-scrollbar所在的容器的position属性必须是以下之一:${rules.join('、')}`
        );
      }
      el_scrollBar(el);
    },

    unmounted(el:any) {
      el._ps_.destroy();
      // eslint-disable-next-line no-param-reassign
      el._ps_ = null;
    }
  }
  Vue.directive('scrollbar', scrollbarDirective)
 }

2. 定义节流指令

import {App,Directive} from "vue";
let timer:any =null;
// 节流指令 一段时间内只执行一次
export default function throttleDirective(Vue:App) {
  const throttleDirective:Directive<HTMLElement> = {
    beforeMount(el:HTMLElement,binding) {
      
      el.addEventListener('click',(event:Event) => {
        const delayTime = binding.value;
        if(!timer) {
          timer = setTimeout(() => {
            console.log('节流节流');
            timer = null
            clearTimeout(timer)
          },delayTime)
        } else {
          event?.stopImmediatePropagation() // 阻止事件冒泡
        }
      })
     
    }
  }
  Vue.directive('throttle',throttleDirective)
}

3.定义防抖指令

import {App,Directive} from "vue";
let timer:any =null;
// 节流指令 一段时间内只执行一次
export default function throttleDirective(Vue:App) {
  const throttleDirective:Directive<HTMLElement> = {
    beforeMount(el:HTMLElement,binding) {
      
      el.addEventListener('click',(event:Event) => {
        const delayTime = binding.value;
        if(!timer) {
          timer = setTimeout(() => {
            console.log('节流节流');
            timer = null
            clearTimeout(timer)
          },delayTime)
        } else {
          event?.stopImmediatePropagation() // 阻止事件冒泡
        }
      })
     
    }
  }
  Vue.directive('throttle',throttleDirective)
}

三、全局引入

在main.ts中引入

import Scrollbar from './scrollbar';

const app = createApp(App)

Scrollbar(app)
app.mount("#app")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue自定义指令中的防抖节流是一种优化技巧,用于处理频繁触发的事件。防抖节流可以减少事件触发的次数,从而提高性能和响应速度。 防抖指的是当事件触发后,等待一段时间后再执行回调函数。如果在等待期间又触发了同样的事件,则会重新计时。这个技巧适用于一些需要等待一段时间后才执行的操作,比如搜索框输入联想功能。通过防抖可以减少不必要的请求次数,提高用户体验。 节流则是指在一定时间间隔内,只执行一次回调函数。如果在间隔时间内有多次事件触发,则只会执行一次。这个技巧适用于一些需要限制频繁触发的操作,比如滚动加载数据。通过节流可以减少不必要的计算和渲染,提高页面性能。 在Vue中,可以通过自定义指令来实现防抖节流的功能。可以使用第三方库如Lodash来简化实现过程,也可以根据需求自己编写相关的代码逻辑。通过自定义指令,可以将防抖节流的逻辑封装到指令中,并在需要的地方进行调用。 例如,可以定义一个防抖指令,在指令的inserted钩子函数中使用Lodash的防抖函数来实现防抖功能。在指令的unbind钩子函数中取消防抖。 ```javascript Vue.directive('debounce', { inserted: function(el, binding) { const delay = binding.value || 200; el.addEventListener('input', _.debounce(function() { // 执行相关操作 }, delay)); }, unbind: function(el) { el.removeEventListener('input'); } }); ``` 类似地,可以定义一个节流指令,在指令的inserted钩子函数中使用Lodash的节流函数来实现节流功能。在指令的unbind钩子函数中取消节流。 ```javascript Vue.directive('throttle', { inserted: function(el, binding) { const delay = binding.value || 200; el.addEventListener('scroll', _.throttle(function() { // 执行相关操作 }, delay)); }, unbind: function(el) { el.removeEventListener('scroll'); } }); ``` 通过使用自定义指令来实现防抖节流,可以更灵活地控制事件的触发频率,提高页面性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值