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