2017-02-13 24 views
27

Mam proste pole wprowadzania w szablonie Vue i chciałbym wykorzystywać zwłoki czasowej mniej więcej tak:Jak zaimplementować odbijanie w Vue2?

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

Jednak nieruchomość debounce został deprecated in Vue 2. Zalecenie mówi tylko: "używaj v-on: input + 3rd copy".

Jak prawidłowo go wdrożyć?

Starałem się go zrealizować za pomocą lodash, v-on: wejście i v model, ale zastanawiam się, czy jest to możliwe do zrobienia bez dodatkowej zmiennej.

W szablonie:

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

W skrypcie:

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

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

filterkey są następnie wykorzystywane później w computed rekwizytów.

+1

spróbować tego http: // stackoverflow.com/questions/41230343/how-to-temporize-the-analysis-of-an-input-field/41232221#41232221 – sobolevn

+2

Proponuję uważnie przeczytać: https://vuejs.org/v2/guide/migration .html # debounce-Param-atrybut-for-v-model-removed –

+1

Istnieje e xample w przewodniku: https://vuejs.org/v2/guide/computed.html#Watchers – Bengt

Odpowiedz

37

Używam debounce pakiet NPM i wdrażane tak:

<input @input="debounceInput"> 

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

Korzystanie lodash i przykład w pytaniu, realizacja wygląda następująco:

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

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

Dzięki za to. Znalazłem podobny przykład w innych dokumentach Vue: https://vuejs.org/v2/examples/index.html (edytor przecinków) – sm4

+0

@ sm4 dzięki za aktualizację! –

+0

Proponowane rozwiązanie ma problem, gdy na stronie znajduje się kilka instancji składnika. Problem został opisany i przedstawione rozwiązanie: https://forum.vuejs.org/t/issues-with-vuejs-component-and-debounce/7224/10 – Valera

1

Proszę zauważyć, że wysłałem tę odpowiedź przed zaakceptowaną odpowiedzią. To nie jest poprawne. To tylko krok naprzód w stosunku do rozwiązania w pytaniu . Zmieniłem przyjęte pytanie, aby pokazać zarówno implementację autora, jak i ostateczne wdrożenie, którego użyłem.


Na podstawie uwag i linked migration document, zrobiłem kilka zmian w kodzie:

W szablonie:

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

W skrypcie:

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

Metoda, która ustawia klucz filtra pozostaje taka sama:

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

To wygląda jak jeden jest mniej połączeń (tylko v-model, a nie v-on:input).

+0

Czy to nie byłoby wywołanie 'debounceInput()' dwukrotnie dla każdej zmiany?'v-on:' wykryje zmiany wejściowe i odrzucenie wywołania, ORAZ ponieważ model jest powiązany, funkcja watchInput wyszuka również nazwę 'debounceInput' ... prawda? – mix3d

+0

@ mix3d Nie rozważ tej odpowiedzi. To było tylko moje dochodzenie, którego nie chciałem zadać. Najprawdopodobniej masz rację. Sprawdź zaakceptowaną odpowiedź. Jest poprawny i zredagowałem go, by pasował do pytania. – sm4

+0

Mój błąd ... Nie wiedziałem, że odpowiedziałeś na własne pytanie, ha! – mix3d