代码之家  ›  专栏  ›  技术社区  ›  Ben

使用Vue.js如何刷新用lodash消除抖动的方法?

  •  3
  • Ben  · 技术社区  · 7 年前

    debounced函数附带了一个cancel方法来取消延迟的func调用和一个 flush方法立即调用它们 .

    但就是这样。没有关于如何调用flush方法的信息。我发现 this

    codepen ):

    <template>
      <input type='text' @keyup="change" @keyup.enter="changeNow">
    </template>
    
    <script>
    export default {
      name: "MyComponent",
      methods: {
        change: _.debounce(function() {
          console.log("changing...");
        }, 250),
        changeNow: function() {
          this.change();
          this.change.flush();
        }
      }
    };
    </script>
    

    change changeNow 引发以下错误:

    未捕获的TypeError:this.change.flush不是函数

    任何关于如何实现这一点的建议将不胜感激!

    2 回复  |  直到 7 年前
        1
  •  6
  •   Stephen Kennedy annamataws    7 年前

    您之所以会遇到问题,是因为vue处理methods部分的方式有一个怪癖。

    .bind this 总是有用的。

    由于这种循环,您只能访问函数本身,而这些函数没有其他成员。

    var app = new Vue({
        el: "#app",    
          data: {
                change: _.debounce(function() {
            console.log("changing...");
          }.bind(this), 1000),
        },
        methods: {
          changeNow: function() {
            this.change.flush();
          }
        }
      });
    

    https://codepen.io/anon/pen/gBZrrj?editors=1111

        2
  •  3
  •   Husam Ibrahim    7 年前

    如果将方法定义移动到已创建的钩子中(如中的示例所示),这似乎是可行的 the docs

    var app = new Vue({
        el: "#app",
        created() {
          this.change = _.debounce(function() {
            console.log("changing...");
          }, 1000);
          this.changeNow = function() {
            console.log("now...")
            this.change();
            this.change.flush();
          };
        }
      });
    

    Codepen