Статьи

Разница между вычисленными свойствами, методами и наблюдателями в Vue

Хотите узнать 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>

Как видите, мы handleSearchnew 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.handleSearchv-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 дает вам суперспособности, необходимые для создания великолепных приложений. Знание того, когда использовать каждый из них, является ключом к созданию того, что понравится вашим пользователям Методы , вычисленные свойства и наблюдатели являются частью доступных вам суперспособностей. Продвигаясь вперед, убедитесь, что используете их хорошо!