【问题标题】:Debouncing input in Vue with variable wait time在 Vue 中使用可变等待时间去抖动输入
【发布时间】:2023-04-02 17:35:01
【问题描述】:

我想在 Vue 中对输入字段进行去抖动,这非常简单,但我想让每个字段的去抖动等待时间可配置,这显然不是那么简单。

我的输入字段由对象支持,如下所示:

filters: [
    {
    title: 'Foo',
    value: null,
    debounce: 1200
  },
    {
    title: 'Bar',
    value: null,
    debounce: 400
  }
]

然后我使用这些对象创建输入字段:

  <div v-for="filter in filters">
    <input type="text" @input="debounceInput($event, filter)" :value="filter.value">
    <span>{{ filter.value }}</span>
  </div>

我正在使用这样的 Lodash debounce 方法,效果很好:

  methods: {
    debounceInput: _.debounce((event, filter) => {
        filter.value = event.target.value;
    }, 500)
  }

但我真的很想让去抖动等待时间可配置。它存储在filter 中,但由于过滤器作为参数传递给_.debounce,我无法在_.debounce 之外访问它,这是我真正需要做的。

我尝试在 debounce 调用周围封装一个匿名函数(这对我来说似乎是最明显的解决方案),如下所示:

debounceInputVariable(event, filter) {
    return _.debounce((event, filter) => {
      filter.value = event.target.value;
    }, filter.debounce)
}

但这不起作用。我也尝试过bindcall 无济于事。

JSFiddle:https://jsfiddle.net/thebluenile/ma6nvqzh/

这可能吗?

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component debounce


    【解决方案1】:

    创建一个方法来为每个过滤器生成去抖动函数:

    generateDebouncers() {
      this.filters.forEach(filter => {
        Vue.set(filter, 'debouncer', _.debounce(function(event) {
          filter.value = event.target.value;
        }, filter.debounce));
      });
    }
    

    这会在每个过滤器上创建一个debouncer 属性,一个要在模板中调用的函数,如下所示:

    <input type="text" @input="filter.debouncer" :value="filter.value">
    

    您可以在created 中对其进行初始化,或者如果您需要它对过滤器持续时间的更改做出反应,请在filters 上的深度监视中调用它。

    这是demo

    【讨论】:

    • 遗憾的是,不...这只是在每个输入事件上创建一个去抖动函数的新实例(并执行它),这违背了目的。
    • 感谢指点!在我的实际应用程序中,我有一个过滤器的工厂功能,我在那里添加了它。现在每个过滤器都有一个debounce 属性,其中包含去抖动功能。
    猜你喜欢
    • 2020-12-06
    • 2016-07-17
    • 2020-01-23
    • 2013-03-10
    • 2021-07-16
    • 2017-09-28
    • 2018-05-15
    • 2019-09-11
    • 2017-07-10
    相关资源
    最近更新 更多