在Vue中使用防抖与节流,及this指向的问题

 更新时间:2022年01月23日 15:15:20   作者:IMP_L  
这篇文章主要介绍了在Vue中使用防抖与节流,及this指向的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用防抖与节流,及this指向问题

最近项目中遇到了防抖与节流问题,搜索了很多文章都有this指向的问题,最后不得不采取一种很low的方法

data中定义isFirst为1

if (this.isFirst < 2){
    this.isFirst = 2
    setTimeout(() => {
        this.isFirst = 1
      }, 1000)
  }

这样就形成了假的节流

但是我们怎么能屈服于这种写法

继续探索vue项目中用闭包的方式防抖节流

一顿操作后

 const delay = (function () {
    let timeout
    return (callback, ms) => {
      if (timeout) clearTimeout(timeout)
      let callNow = !timeout
      timeout = setTimeout(() => {
        timeout = undefined
      }, ms)
      if (callNow) callback.apply(this, [callback, ms])
    }
  })()
 export default {
    methods: {
        delay(() => {
          // do something
       }, 1000)
    }
}

用了立即执行的函数方法,就能够获取到全局的this了 

使用防抖函数所遇见的坑

以前的防抖和节流都是在js中直接书写,后使用vue进行组件化开发之后,有些地方需要注意。

正常写法

    function debounce(func, delay) {
      let timeout
      return function () {
        let context = this;
        let args = arguments;
        if (timeout) {
          clearTimeout(timeout)
        }
        timeout = setTimeout(() => {
          func.apply(context, args)
        }, delay)
      }
    }

使用

    function change(volume, data) {
      debounce(() => {
        console.log('change', volume, data);
      }, 500)
    }

Vue中写法使用

注意: Vue中使用时,需要定义timeout,同时在防抖函数中,this的指向发生了变化,需要在return之前获取vue实例。这个时候,你直接使用,还是不行的,只要debug就会发现debounce返回的func没有进去,需要手动执行一下(添加括号)。

  data() {
    return {
      timeout: null
    }
  }
    change(volume, data) {
      this.debounce(() => {
        console.log('change', volume, data)
      }, 500)
    },
    debounce(func, delay) {
      let context = this // this指向发生变化,需要提出来
      let args = arguments
      return function () {
        if (context.timeout) {
          clearTimeout(context.timeout)
        }
        context.timeout = setTimeout(() => {
          func.apply(context, args)
        }, delay)
      }()// 注意:我加了()
    }

Vue中的watch的防抖简写

    watchObj: {
      handler(val) {
        let _this = this
        clearTimeout(this.timeout)
        this.timeout = setTimeout(() => {
          _this.handlerData(val)
        }, 500)
      }
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue.js iview打包上线后字体图标不显示解决办法

    vue.js iview打包上线后字体图标不显示解决办法

    这篇文章主要介绍了vue.js iview打包上线后字体图标不显示解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • vue中post请求报400的解决方案

    vue中post请求报400的解决方案

    这篇文章主要介绍了vue中post请求报400的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue3全局组件通信之provide / inject详解

    Vue3全局组件通信之provide / inject详解

    这篇文章主要介绍了Vue3全局组件通信之provide / inject,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • vue for循环出来的数据实现用逗号隔开

    vue for循环出来的数据实现用逗号隔开

    HTML(HyperText Markup Language)是用于创建网页的标准标记语言,正确的HTML编码和结构对于网页的正确显示至关重要,当HTML代码正确无误时,网页的效果图将与设计师的预期相符,反之则可能出现布局错乱、样式失效等问题
    2024-10-10
  • vue全局实现数字千位分隔符格式

    vue全局实现数字千位分隔符格式

    这篇文章主要为大家详细介绍了vue全局实现数字千位分隔符格式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 基于IView中on-change属性的使用详解

    基于IView中on-change属性的使用详解

    下面小编就为大家分享一篇基于IView中on-change属性的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Vue实现万年日历的示例详解

    Vue实现万年日历的示例详解

    又是一个老生常谈的功能,接下来会从零实现一个万年日历,从布局到逻辑,再到随处可见的打卡功能。文中的示例代码简洁易懂,需要的可以参考一下
    2023-01-01
  • vue中利用Promise封装jsonp并调取数据

    vue中利用Promise封装jsonp并调取数据

    Promise就是一个给一步操作提供的容器,在这个容器里,有两个阶段无法改变的阶段,这两个阶段在文中给大家提到。对vue中利用Promise封装jsonp并调取数据 的相关知识感兴趣的朋友,跟随小编一起看看吧
    2019-06-06
  • webpack4+express+mongodb+vue实现增删改查的示例

    webpack4+express+mongodb+vue实现增删改查的示例

    这篇文章主要介绍了webpack4+express+mongodb+vue 实现增删改查的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • VUE3中watch和watchEffect的用法详解

    VUE3中watch和watchEffect的用法详解

    本文主要介绍了VUE3中watch和watchEffect的用法详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论