zoukankan      html  css  js  c++  java
  • vue中的防抖和节流

    防抖:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

    使用场景:频繁触发、输入框搜索

    因为防抖的特性,一直执行最后一次的触发,所以可以用于鼠标移动确定最后一次移动的时候的坐标位置。

    export const Debounce = (fn, t) => {
      let delay = t || 500;
      let timer;
      return function () {
        let args = arguments;
        if (timer) {
          clearTimeout(timer);
        }
        timer = setTimeout(() => {
          timer = null;
          fn.apply(this, args);
        }, delay);
      };
    };

    实例

    <template>
     <div>
      <input type='text' v-model='value' @keydown = "hangleChange">
     </div>
    </template>
    
    <script>
    function debounce(func, wait=1000){ //可以放入项目中的公共方法中进行调用
     let timeout;
     return function(event){
      clearTimeout(timeout)
      timeout = setTimeout(()=>{
       func.call(this, event)
      },wait)
     }
    }
    export default{
     name:'',
     data(){
      return{
       value:''
      }
    },
     methods:{
      hangleChange:debounce(function(e){
       console.log(this.value)
      })
     }
    }
    </script>

    节流:高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率

    使用场景:频繁触发、onrize,onscroll滚动条

    因为节流是监听到第一次触发事件后就执行,所以可以用来防止按钮多次点击执行多次,且按照第一次点击的事件为准

    export const Throttle = (fn, t) => {
      let last;
      let timer;
      let interval = t || 500;
      return function () {
        let args = arguments;
        let now = +new Date();
        if (last && now - last < interval) {
          clearTimeout(timer);
          timer = setTimeout(() => {
            last = now;
            fn.apply(this, args);
          }, interval);
        } else {
          last = now;
          fn.apply(this, args);
        }
      };
    };

    实例

    <template>
     <div class="scroll" ref="previewText" @scroll.passive="fnScroll">
    </template>
    <script>
     export default{
      name:'globalHospot',
      data(){
        return{
          count:0,
          fnScroll:() =>{}
        }
      },
      methods: {
        fnHandleScroll (e) {
          console.log('scroll触发了:' + this.count++, new Date())
        },
        fnThrottle(fn, delay, atleast){  //节流函数
          let timer = null;
          let previous = null;
          return function(){
            let now = +new Date()
            if(!previous) previous = now;
            if(atleast && now - previous > atleast){
              fn();
              previous = now;
              clearTimeout(timer)
            }else{
              clearTimeout(timer)
              timer = setTimeout(()=>{
                fn();
                previous = null
              },delay)
            }
          }
        }
      },
      created(){
        this.fnScroll = this.fnThrottle(this.fnHandleScroll, 1000)  //刚创建时执行
      },
    }
    </script>
  • 相关阅读:
    Python 极简教程(十)集合 set
    Python 极简教程(九)元组 tuple
    Python 极简教程(七)列表 list
    Python 极简教程(八)字符串 str
    DevOps实践之一:基于Docker构建企业Jenkins CI平台
    kubernetes实践之一:kubernetes二进制包安装
    Linux挖矿病毒 khugepageds详细解决步骤
    kubernetes实践之五:深入理解Service及内部DNS搭建
    kubernetes实践之四:深入理解控制器(workload)
    kubernetes实践之三:深入理解Pod对象
  • 原文地址:https://www.cnblogs.com/qiye2016/p/13529648.html
Copyright © 2011-2022 走看看