Причина, по которой он фильтруется мгновенно при вводе в поле поиска, заключается в том, что filteredItems
является вычисляемым свойством, которое означает, что оно будет запускаться каждый раз, когда изменяется значение search
, то есть каждый раз, когда вы вводите новый символ.
Чтобы отфильтровать элементы только после нажатия кнопки, удалите filteredItems
из computed
и создайте функцию filterItems
в вашем methods
и присоедините этот обработчик к событию нажатия кнопки.
methods: {
filterItems() {
this.filteredItems = _.orderBy(
this.items.filter(item => {
if (!this.search) return this.items;
return (
item.title.toLowerCase().includes(this.search.toLowerCase()) ||
item.action.toLowerCase().includes(this.search.toLowerCase()) ||
item.headline.toLowerCase().includes(this.search.toLowerCase()) ||
item.subtitle.toLowerCase().includes(this.search.toLowerCase())
);
}),
"headline"
);
}
}
<button type="button" class="btn btn-lg btn-danger" @click="filterItems">Search</button>
Обратите внимание, что я присвоил результат функции filteredItems
это новое свойство, которое вы должны добавить к вашему data
объекту.
Причина в том, что ваша filterItems
функция не должна изменять исходный items
, а создавать новый массив при выполнении, иначе это вызовет ошибку, если вы измените исходные элементы и попытаетесь отфильтровать его снова.
Итак, в вашем data
объекте добавьте filteredItems
, начальное значение которого будет равно items
, так как оно еще не отфильтровано при монтировании вашего приложения.
const items = [];
new Vue({
data: {
filteredItems: items,
items: items
}
})
См. рабочая реализация .
Обратите внимание, что я также вызываю filterItems()
, когда вы очищаете свой поиск, чтобы он сбрасывал данные, но вы можете просто удалить его из clearSearch()
, если вы не хотите такого поведения.