2017-02-13 13 views
27

У меня есть простое поле ввода в шаблоне Vue, и я хотел бы использовать дребезг более или менее, как это:Как реализовать debounce в Vue2?

<input type="text" v-model="filterKey" debounce="500"> 

Однако debounce имущества было deprecated in Vue 2. В рекомендации говорится: «использовать v-on: вход + функция дебаза третьей стороны».

Как вы его правильно реализуете?

Я пытался реализовать его с помощью lodash, v-на: вход и v-модель, но мне интересно, если это можно сделать без дополнительной переменной.

В шаблоне:

<input type="text" v-on:input="debounceInput" v-model="searchInput"> 

В сценарии:

data: function() { 
    return { 
    searchInput: '', 
    filterKey: '' 
    } 
}, 

methods: { 
    debounceInput: _.debounce(function() { 
    this.filterKey = this.searchInput; 
    }, 500) 
} 

filterkey затем используется позже в computed реквизита.

+1

Попробуйте один Http: // stackoverflow.com/questions/41230343/how-to-temporize-the-analysis-of-an-input-field/41232221#41232221 – sobolevn

+2

Я бы предложил внимательно прочитать: https://vuejs.org/v2/guide/migration .html # debounce-Param-Attribute-for-v-model-deleted –

+1

Существует e xample в руководстве: https://vuejs.org/v2/guide/computed.html#Watchers – Bengt

ответ

37

Я использую debounce НПМ пакет и реализуется следующим образом:

<input @input="debounceInput"> 

methods: { 
    debounceInput: debounce(function (e) { 
     this.$store.dispatch('updateInput', e.target.value) 
    }, config.debouncers.default) 
} 

Использование lodash и пример в этом вопросе, реализация выглядит следующим образом:

<input v-on:input="debounceInput"> 

methods: { 
    debounceInput: _.debounce(function (e) { 
    this.filterKey = e.target.value; 
    }, 500) 
} 
+3

Спасибо за это. Я нашел аналогичный пример в некоторых других документах Vue: https://vuejs.org/v2/examples/index.html (редактор меток) – sm4

+0

@ sm4 благодарит за обновление! –

+0

Предлагаемое решение имеет проблему при наличии нескольких экземпляров компонентов на странице. Проблема описана и представлено здесь: https://forum.vuejs.org/t/issues-withjs-component-and-debounce/7224/10 – Valera

1

Обратите внимание, что я отправил этот ответ перед принятым ответом. Это не правильно. Это только шаг вперед от решения в вопросе . Я отредактировал принятый вопрос, чтобы показать как реализацию автора, так и конечную реализацию, которую я использовал.


на основе замечаний и linked migration document, я сделал несколько изменений в коде:

В шаблоне:

<input type="text" v-on:input="debounceInput" v-model="searchInput"> 

В сценарии:

watch: { 
    searchInput: function() { 
    this.debounceInput(); 
    } 
}, 

И метод, который устанавливает ключ фильтра, остается неизменным:

methods: { 
    debounceInput: _.debounce(function() { 
    this.filterKey = this.searchInput; 
    }, 500) 
} 

Это похоже есть один меньше вызовов (только v-model, а не v-on:input).

+0

Не будет ли этот вызов 'debounceInput()' дважды для каждого изменения?'v-on:' будет определять входные изменения и вызывать debounce, а поскольку модель привязана, функция watchInput watch также будет вызывать 'debounceInput' ... правильно? – mix3d

+0

@ mix3d Не учитывайте этот ответ. Это было мое исследование, и я не хотел ставить вопрос. Вы, скорее всего, правы. Проверьте принятый ответ. Это правильно, и я отредактировал его в соответствии с вопросом. – sm4

+0

Моя ошибка ... Я не понимал, что ты ответил на свой вопрос, ха! – mix3d