Декораторы представляют собой специальный синтаксический сахар в JavaScript и TypeScript, который позволяет добавлять метаданные и изменять поведение классов, методов и свойств. В контексте Vue.js они активно применяются при работе с классовыми компонентами, обеспечивая более читаемый и структурированный код.
Vue 2 по умолчанию использует объектную структуру компонентов. С
появлением TypeScript и библиотеки vue-class-component
стало возможным создавать компоненты на основе классов. Это позволяет
использовать декораторы для упрощения работы с состоянием, методами и
жизненным циклом компонента.
Пример базового компонента на классе:
import Vue from 'vue';
import Component from 'vue-class-component';
@Component
export default class MyComponent extends Vue {
message: string = 'Привет, Vue!';
mounted() {
console.log(this.message);
}
}
Здесь @Component является декоратором
класса, который превращает обычный класс в полноценный
Vue-компонент, обрабатывает его данные и методы.
Для работы с реактивными свойствами и вычисляемыми значениями часто
используют декораторы из vue-property-decorator:
Пример использования:
import { Vue, Component, Prop, Watch, Emit } from 'vue-property-decorator';
@Component
export default class Counter extends Vue {
@Prop({ default: 0 }) initialCount!: number;
count: number = this.initialCount;
@Watch('count')
onCountChanged(newVal: number, oldVal: number) {
console.log(`Счёт изменился с ${oldVal} на ${newVal}`);
}
@Emit('incremented')
increment() {
this.count += 1;
}
}
Ключевые моменты:
@Prop делает initialCount реактивным и
позволяет передавать его из родительского компонента.@Watch автоматически подписывает метод на изменение
свойства count.@Emit генерирует событие incremented при
вызове метода increment.Vue поддерживает стандартные хуки жизненного цикла:
created, mounted, updated,
destroyed и другие. С помощью декораторов их можно
использовать более компактно:
import { Vue, Component } from 'vue-property-decorator';
@Component
export default class LifecycleExample extends Vue {
mounted() {
console.log('Компонент смонтирован');
}
destroyed() {
console.log('Компонент уничтожен');
}
}
Каждый метод жизненного цикла определяется как обычный метод класса,
но благодаря декоратору @Component Vue корректно
интегрирует его в внутренние процессы.
Помимо встроенных, можно создавать собственные декораторы для повторяющихся задач. Например, логирование вызовов методов:
function Log(target: any, key: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Вызов метода ${key} с аргументами:`, args);
return original.apply(this, args);
};
return descriptor;
}
@Component
export default class Demo extends Vue {
@Log
greet(name: string) {
return `Привет, ${name}!`;
}
}
Такой декоратор можно применять к любому методу класса, автоматически добавляя функциональность без изменения самого метода.
Декораторы упрощают работу с реактивными данными, но важно помнить особенности реактивной системы Vue:
@Prop или обычных свойств
класса.push, splice) или создавать новые копии,
чтобы реактивность корректно отрабатывала.@Prop, @Emit и @Watch
минимизируют шаблонный код.Декораторы в Vue.js обеспечивают высокий уровень абстракции и удобство в разработке сложных приложений. Они позволяют интегрировать TypeScript с реактивной системой Vue, создавать чистый код и легко расширять функциональность компонентов.