Что такое class component в Vue 2

Ответ

В Vue 2 class component — это альтернативный синтаксис для создания компонентов с использованием классов ES6 вместо стандартного объекта options. Это достигается через библиотеку vue-class-component (официальная) или vue-property-decorator (расширенная версия с декораторами).

Основные особенности:

  • Класс наследуется от Vue
  • Методы и computed свойства объявляются как методы класса
  • Декораторы упрощают объявление props, watch и других опций

Пример:

import Vue from 'vue'
import Component from 'vue-class-component'

@Component({
  props: {
    message: String
  }
})
export default class HelloWorld extends Vue {
  // Data
  count = 0

  // Computed
  get doubled() {
    return this.count * 2
  }

  // Method
  increment() {
    this.count++
  }
}

Плюсы:

  • Более привычный синтаксис для разработчиков с ООП-бэкграундом
  • Лучшая поддержка TypeScript

Минусы:

  • Дополнительная зависимость
  • Менее "вуевый" подход по сравнению с options API

Ответ 18+ 🔞

Слушай, а вот эта вся хуйня с Vue 2 и классовыми компонентами — это, блядь, как приехать на «Запорожце» в костюме от Армани. Вроде и машина едет, и костюм норм, но в целом — пиздец какой-то диссонанс.

Вот смотри. По уму-то, Vue — он про объекты, про data, methods, эту всю простоту. А тут приходят ребята с бэкграундом в ООП, глаза горят, и говорят: «А давайте сделаем на классах, ёпта!». И родилась библиотечка vue-class-component. А потом, как водится, пошли декораторы — vue-property-decorator. И понеслась, блядь, писать компоненты, как в каком-нибудь Angular, только с привкусом Vue.

Как это выглядит, на примере:

import Vue from 'vue'
import Component from 'vue-class-component'

@Component({
  props: {
    message: String // Вот тебе пропс, получай
  }
})
export default class HelloWorld extends Vue { // Наследуешься, как будто так и надо
  // Data? Да хуй там! Просто поля класса.
  count = 0

  // Computed? Объявляй как геттер, и все дела.
  get doubled() {
    return this.count * 2
  }

  // Method? Обычный метод класса, что тут непонятного?
  increment() {
    this.count++ // И this работает, мать его.
  }
}

И что в этом, спрашивается, хорошего?

  • Для тех, кто вырос на классах и TypeScript — это родной дом, блядь. Не надо перестраивать мозг.
  • С тайпскриптом оно действительно дружит лучше, описание типов прямо в коде, красота.

А что пиздецового?

  • Это ж ещё одна зависимость, сука! Ещё один пакет, который может сломаться, устареть или просто не встать.
  • Это уже не «вуевый» подход, это какое-то извращение. Vue тем и хорош был, что простой, а тут на тебе — классы, декораторы, наследование. Ёперный театр!

В общем, инструмент на любителя. Хочешь почувствовать себя крутым enterprise-разработчиком — вперёд. Но помни, что под капотом-то всё тот же Vue 2, просто в другом парике.