如何在 vuejs2 中执行“用户停止输入后提交表单”

Posted

技术标签:

【中文标题】如何在 vuejs2 中执行“用户停止输入后提交表单”【英文标题】:How to do "submit form after user stop typing" in vuejs2 【发布时间】:2020-04-29 20:41:45 【问题描述】:

我有一个搜索模块,其中:当用户停止输入时,它应该搜索名称

我认为解决方案是在用户keyup 时执行timeout。 reference

<input type="text" @keyup="textSearch($event)">

textSearch(e)
    var timer;
    clearTimeout(timer);

    timer = setTimeout(() => 
        alert('searching...');
    , 2500);

代码一切正常,问题是为什么我在 1 秒内输入 3 个字符时会弹出 3 个警报?我希望应该有一个弹出窗口,因为它等待 2.5 秒。

代码有问题吗?需要帮助先生们

【问题讨论】:

npmjs.com/package/vue-debounce @Hamelraj 谢谢,在这种情况下不需要setTimeout 是的,你可以简单地使用 【参考方案1】:

另一个解决方案是使用watch 而不是event-keyup。您必须先创建model

<input type="text" v-model="searchTxt">

data()
    return
        searchTxt: ''
    
,

watch: 
    searchTxt: function(val) 
        if (!this.awaitingSearch) 
          setTimeout(() => 
            alert('searching');
            alert(this.searchTxt); //alert value

            this.awaitingSearch = false;
          , 2500); // 2.5 sec delay
        
        this.awaitingSearch = true;
    

More information

【讨论】:

解决方案有效。但我更喜欢标记的答案,谢谢您的回复先生。投了赞成票!【参考方案2】:

这里有一个解决方案:

setTimeout 很好 -- 或者,您可以使用 debounce Vue-debounce

<input v-debounce:400ms="myFn" type="text" />

<script>
export default 
  methods: 
    myFn(val) 
      console.log(val) // => The value of the input
    
  

</script>

【讨论】:

【参考方案3】:

如果我正确理解您的问题,您每次运行 textsearch() 时清除的超时不是您上次创建的超时,而是您刚刚使用 var timer 声明的超时。 我建议将您的计时器变量存储在您的数据属性中,而不是让 clearTimeout 清除正确的超时。

类似这样的:

data: 
    timer: undefined
,
methods: 
    textSearch(e)
      clearTimeout(this.timer)

      this.timer = setTimeout(() => 
          alert('searching...')
      , 2500)
    

用我的修改来修改你的代码:

https://jsfiddle.net/MapletoneMartin/yjxfsehz/2/

祝你好运!

【讨论】:

解决方案有效。但我更喜欢标记的答案,感谢您的回复先生。投了赞成票!【参考方案4】:

我解决这个问题的方法是在 Vue 数据中使用 timer 变量,因为当在计时器函数内部调用的 textSearch 方法被重新分配时。

data () 
    return 
        timer: null
    



textSearch(e)
    clearTimeout(this.timer);

    this.timer = setTimeout(() => 
        alert('searching...');
    , 2500);

我认为这将解决您的问题。

【讨论】:

解决方案有效。但我更喜欢标记的答案,感谢您的回复先生。投了赞成票!

以上是关于如何在 vuejs2 中执行“用户停止输入后提交表单”的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs2 - 如何将两个数组中的元素与计算属性进行比较?

Vuejs2:数组更改时如何重新渲染数组计算属性

vuejs2:如何将 vuex 存储传递给 vue-router 组件

具有计算值的 vuejs2 el-table-column 列道具

VueJs2.0建议学习路线

VueJs2.0建议学习路线