Хотите узнать Vue.js с нуля? Получите полную коллекцию книг Vue, охватывающих основы, проекты, советы и инструменты и многое другое с SitePoint Premium. Присоединяйтесь сейчас всего за $ 14,99 / месяц .
Для тех, кто начинает изучать Vue, существует некоторая путаница по поводу разницы между методами, вычисляемыми свойствами и наблюдателями.
Несмотря на то, что часто можно использовать каждый из них для достижения более или менее одного и того же, важно знать, где каждый затмевает других.
В этом кратком совете мы рассмотрим эти три важных аспекта приложения Vue и их варианты использования. Мы сделаем это путем создания одного и того же поискового компонента, используя каждый из этих трех подходов.
методы
Метод более или менее то, что вы ожидаете — функция, которая является свойством объекта. Вы используете методы для реагирования на события, которые происходят в DOM, или вы можете вызывать их из других частей вашего компонента, например, из вычисляемого свойства или наблюдателя. Методы используются для группировки общих функций — например, для обработки отправки формы или для создания многократно используемой функции, такой как выполнение запроса Ajax.
Вы создаете метод в экземпляре Vue внутри объекта methods
new Vue({
el: "#app",
methods: {
handleSubmit() {}
}
})
И когда вы хотите использовать это в своем шаблоне, вы делаете что-то вроде этого:
<div id="app">
<button @click="handleSubmit">
Submit
</button>
</div>
Мы используем директиву v-on, чтобы прикрепить обработчик событий к нашему элементу DOM, который также может быть сокращен до знака @
Метод handleSubmit
Для случаев, когда вы хотите передать аргумент, который понадобится в теле метода, вы можете сделать это:
<div id="app">
<button @click="handleSubmit(event)">
Submit
</button>
</div>
Здесь мы передаем объект события, который, например, позволил бы нам предотвратить действие браузера по умолчанию в случае отправки формы.
Однако, поскольку мы используем директиву для присоединения к событию, мы можем использовать модификатор для достижения того же результата более элегантно: @click.stop="handleSubmit"
Теперь давайте рассмотрим пример использования метода для фильтрации списка данных в массиве.
В демоверсии мы хотим отобразить список данных и поле поиска. Отображаемые данные изменяются всякий раз, когда пользователь вводит значение в поле поиска. Шаблон будет выглядеть так:
<div id="app">
<h2>Language Search</h2>
<div class="form-group">
<input
type="text"
v-model="input"
@keyup="handleSearch"
placeholder="Enter language"
class="form-control"
/>
</div>
<ul v-for="(item, index) in languages" class="list-group">
<li class="list-group-item" :key="item">{{ item }}</li>
</ul>
</div>
Как видите, мы handleSearch
new Vue({
Нам нужно создать метод и данные:
el: '#app',
data() {
return {
input: '',
languages: []
}
},
methods: {
handleSearch() {
this.languages = [
'JavaScript',
'Ruby',
'Scala',
'Python',
'Java',
'Kotlin',
'Elixir'
].filter(item => item.toLowerCase().includes(this.input.toLowerCase()))
}
},
created() { this.handleSearch() }
})
handleSearch
Метод methods
Стоит отметить, что в объекте this.handleSearch
v-for
Вычисленные Свойства
Хотя поиск в приведенном выше примере работает, как и ожидалось, более элегантным решением будет использование вычисляемого свойства . Вычисленные свойства очень удобны для составления новых данных из существующих источников, и одно из их больших преимуществ перед методами заключается в том, что их выходные данные кэшируются. Это означает, что если что-то независимое от вычисляемого свойства изменяется на странице и пользовательский интерфейс перерисовывается, кэшированный результат будет возвращен, и вычисленное свойство не будет пересчитано, что избавит нас от потенциально дорогой операции.
Вычисленные свойства позволяют нам производить вычисления на лету, используя доступные нам данные. В этом случае у нас есть массив элементов, которые необходимо отсортировать. Мы хотим выполнить сортировку, когда пользователь вводит значение в поле ввода.
Наш шаблон выглядит практически идентично предыдущей итерации, за исключением того, что мы передаем директиве filteredList
<div id="app">
<h2>Language Search</h2>
<div class="form-group">
<input
type="text"
v-model="input"
placeholder="Enter language"
class="form-control"
/>
</div>
<ul v-for="(item, index) in filteredList" class="list-group">
<li class="list-group-item" :key="item">{{ item }}</li>
</ul>
</div>
data
Сценарий немного отличается. Мы объявляем языки в свойстве new Vue({
el: "#app",
data() {
return {
input: '',
languages: [
"JavaScript",
"Ruby",
"Scala",
"Python",
"Java",
"Kotlin",
"Elixir"
]
}
},
computed: {
filteredList() {
return this.languages.filter((item) => {
return item.toLowerCase().includes(this.input.toLowerCase())
})
}
}
})
filteredList
Вычисленное свойство FilterList будет содержать массив элементов, которые включают значение поля ввода. При первом рендеринге (когда поле ввода пусто) будет обработан весь массив. Когда пользователь вводит значение в поле, filteredList
При использовании вычисляемых свойств должны быть доступны данные, которые вы хотите вычислить, иначе это приведет к ошибке в вашем приложении.
Свойство Computed создает новое свойство filteredList
Значение filteredList
Зависимость, которая может измениться здесь, является значением input
Наконец, обратите внимание, что вычисляемые свойства позволяют нам создать переменную для использования в нашем шаблоне, которая построена из одного или нескольких свойств данных. Одним из распространенных примеров является создание fullName
computed: {
fullName() {
return `${this.firstName} ${this.lastName}`
}
}
В шаблоне вы можете сделать {{ fullName }}
Значение fullName
Зрителей
Наблюдатели полезны в случаях, когда вы хотите выполнить действие в ответ на произошедшее изменение (например, для реквизита или свойства данных). Как упоминается в документации Vue , это наиболее полезно, когда вы хотите выполнять асинхронные или дорогостоящие операции в ответ на изменение данных.
В нашем примере поиска мы можем вернуться к примеру с нашими методами и настроить наблюдатель для свойства input
Затем мы можем реагировать на любые изменения стоимости для input
Сначала вернемся к шаблону, чтобы использовать свойство данных languages
<div id="app">
<h2>Language Search</h2>
<div class="form-group">
<input
type="text"
v-model="input"
placeholder="Enter language"
class="form-control"
/>
</div>
<ul v-for="(item, index) in languages" class="list-group">
<li class="list-group-item" :key="item">{{ item }}</li>
</ul>
</div>
Тогда наш экземпляр Vue будет выглядеть так:
new Vue({
el: "#app",
data() {
return {
input: '',
languages: []
}
},
watch: {
input: {
handler() {
this.languages = [
'JavaScript',
'Ruby',
'Scala',
'Python',
'Java',
'Kotlin',
'Elixir'
].filter(item => item.toLowerCase().includes(this.input.toLowerCase()))
},
immediate: true
}
}
})
Здесь я сделал наблюдателя объектом (в отличие от функции). Это сделано для того, чтобы я мог указать immediate
Это приводит к заполнению списка. Затем выполняемая функция находится в свойстве handler
Вывод
Как говорится, с большой силой приходит большая ответственность. Vue дает вам суперспособности, необходимые для создания великолепных приложений. Знание того, когда использовать каждый из них, является ключом к созданию того, что понравится вашим пользователям Методы , вычисленные свойства и наблюдатели являются частью доступных вам суперспособностей. Продвигаясь вперед, убедитесь, что используете их хорошо!