【问题标题】:Vuejs - debounce via lodash, pass 'wait' argumentVuejs - 通过 lodash 去抖动,传递“等待”参数
【发布时间】:2021-02-05 22:24:17
【问题描述】:

我正在尝试制作一个包含去抖动的方法(使用 Lodash),它可以动态传递其 wait 参数。

这是我尝试使用输入字段执行此操作的示例代码 - 每次用户进行输入时它都会记录“命中”:

<template>
  <div id="app">
    <input @input='validateInput1(400)'>
  </div>
</template>

<script>
import _ from 'lodash';

export default {
  name: "App",
  data() {
    return {

    };
  },
  methods: {
    validateInput1: _.debounce(function() {
      console.log('Hit 1!');
    }, 400),
    validateInput2(delay = 1000) {
        function test() {
          console.log('Hit 2!');
        }
        const doDebounce = _.debounce(test, delay);
        doDebounce();
    }
  }
};
</script>

https://codesandbox.io/s/eloquent-wescoff-hs8wi?file=/src/App.vue

我正在尝试两种不同的方法来实现这一目标。使用 validateInput1 方法,我看不到如何传入 wait 参数。

使用 validateInput2 方法,我可以传入 wait 参数,但是外部的 validateInput2 方法在我需要输入时立即运行整个方法通过 wait 运行。 validateInput1 方法在延迟后运行整个方法,但我无法通过 validateInput1 传入 wait 参数。

【问题讨论】:

    标签: javascript vue.js lodash


    【解决方案1】:

    虽然代码本身看起来很丑陋,但它可以正常工作。

    <template>
      <div id="app">
        <input @input="validateInput2(10)" />
      </div>
    </template>
    
    <script>
    import _ from "lodash";
    
    export default {
      name: "App",
      data() {
        return {
          debounce: null,
        };
      },
      methods: {
        validateInput2(delay = 1000) {
          if (this.debounce) {
            return this.debounce();
          }
    
          const deb = _.debounce(function test() {
            console.log("Hit 2!");
          }, delay); // I want to reuse it
          this.debounce = deb;
          return deb();
        },
      },
    };
    </script>
    

    虽然我确实理解将延迟超时放在模板中而不是脚本中看起来更清楚,但我的回答肯定比您拥有的validateInput1 解决方案更糟糕。

    但无论如何,如果您能想到如何创建更好、更清洁的解决方案,请随时与我们分享。

    【讨论】:

      【解决方案2】:

      实现此目的的一种(快速)方法是返回一个函数:

      validateInput2(delay = 1000) {
        function test() {
          console.log('Hit 2!');
        }
        const doDebounce = _.debounce(test, delay);
        return doDebounce;
      }
      

      然后在你的模板中:

      <input @input="validateInput2(400)()" />
      

      它的作用:第一次调用发送延迟。其次是在@input 上调用组合函数。

      【讨论】:

      • 它似乎不起作用。如果我快速按下一个键五次,该函数会运行五次(它应该只运行一次)。 Vuejs 也产生错误:[Vue warn]: Error in v-on handler: "TypeError: _vm.validateInput2(...) is not a function"
      • _ 正在为您编写一个函数。如果您希望能够发送延迟,那么您不能在 @input 事件上执行此操作。因为每次触发事件时它都会编写新函数。就像我的例子一样。
      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 2020-12-06
      • 2014-02-02
      • 2015-05-21
      • 2017-04-27
      • 2019-01-27
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多