Spec-Zone.ru › Lit 2

Декораторы

Декораторы — это специальные функции, которые могут изменять поведение классов, методов классов и полей классов. Lit использует декораторы для предоставления декларативных API, например, для регистрации элементов, реактивных свойств и запросов.

Декораторы — это предложение 3-го этапа о включении в стандарт ECMAScript. В настоящее время ни один браузер не реализует декораторы, но компиляторы, такие как Babel и TypeScript, поддерживают более раннюю версию предложения о декораторах. Декораторы Lit работают с Babel и TypeScript и будут обновлены для поддержки окончательной спецификации после её реализации в браузерах.

Дополнительную информацию см. в разделе Включение декораторов.

Белая буква i в синем круге

Что означает 3-й этап?

3-й этап означает, что текст спецификации завершён и готов к реализации в браузерах. После реализации спецификации в нескольких браузерах она может перейти на заключительный этап, 4-й этап, и быть добавлена в стандарт ECMAScript. Предложение 3-го этапа всё ещё может измениться, но только в случае обнаружения критических проблем во время реализации.

Lit предоставляет набор декораторов, которые сокращают объём шаблонного кода, необходимого для определения компонента. Например, декораторы @customElement и @property делают определение простого элемента более компактным:

@customElement('my-element')
export class MyElement extends LitElement {
  @property() greeting = "Welcome";
  @property() name = "Sally";
  @property({type: Boolean}) emphatic = true;
  //...
}

Декоратор @customElement определяет пользовательский элемент и эквивалентен вызову:

customElements.define('my-element', MyElement);

Декоратор @property объявляет реактивное свойство.

Дополнительную информацию о настройке свойств см. в разделе Реактивные свойства.

Встроенные декораторы

Декоратор Описание Подробнее
@customElement Определяет пользовательский элемент Выше
@eventOptions Добавляет параметры обработчика события. События
@property Определяет общедоступное свойство. Свойства
@state Определяет приватное свойство состояния Свойства
@query Определяет свойство, возвращающее элемент из шаблона компонента. Shadow DOM
@queryAll Определяет свойство, возвращающее список элементов из шаблона компонента. Shadow DOM
@queryAsync Определяет свойство, возвращающее промис, который разрешается в элемент из шаблона компонента. Shadow DOM
@queryAssignedElements Определяет свойство, возвращающее дочерние элементы, назначенные определённому слоту. Shadow DOM
@queryAssignedNodes Определяет свойство, возвращающее дочерние узлы, назначенные определённому слоту. Shadow DOM

Импорт декораторов

Вы можете импортировать все декораторы Lit через модуль lit/decorators.js:

import {customElement, property, eventOptions, query} from 'lit/decorators.js';

Чтобы сократить объём кода, необходимого для работы компонента, декораторы можно импортировать по отдельности в код компонента. Все декораторы доступны в lit/decorators/<decorator-name>.js. Например:

import {customElement} from 'lit/decorators/custom-element.js';
import {eventOptions} from 'lit/decorators/event-options.js';

Включение декораторов

Для использования декораторов необходимо собирать код с помощью компилятора, например TypeScript или Babel.

В будущем, когда декораторы станут встроенной функцией веб-платформы, это может больше не требоваться.

Использование декораторов с TypeScript

Чтобы использовать декораторы с TypeScript, включите параметр компилятора experimentalDecorators.

Также убедитесь, что параметр useDefineForClassFields установлен в значение false. Обратите внимание: это требуется только в том случае, если для параметра target задано значение esnext или выше, однако рекомендуется явно убедиться, что для этого параметра установлено значение false.

"experimentalDecorators": true,
"useDefineForClassFields": false,

Включать emitDecoratorMetadata не требуется и не рекомендуется.

Использование декораторов с Babel

Если вы компилируете JavaScript с помощью Babel, можно включить декораторы, добавив следующие плагины и параметры:

  • @babel/plugin-proposal-decorators
  • @babel/plugin-proposal-class-properties

Обратите внимание: в последних версиях Babel @babel/plugin-proposal-class-properties может не требоваться.

Чтобы настроить плагины, добавьте в конфигурацию Babel код, подобный этому:

"assumptions": {
  "setPublicClassFields": true
},
"plugins": [
  ["@babel/plugin-proposal-decorators", {
    "version": "2018-09",
    "decoratorsBeforeExport": true
  }],
  ["@babel/plugin-proposal-class-properties"]
]

Поддержка декораторов в Babel проверена с version: '2018-09'. Сейчас это значение используется по умолчанию, однако мы рекомендуем указывать версию явно на случай изменения значения по умолчанию. Другие версии ('2021-12' или 'legacy') не поддерживаются, но это может измениться по мере развития Babel. Если хотите поэкспериментировать, см. документацию Babel.

Использование декораторов с TypeScript и Babel

При использовании TypeScript с Babel важно в конфигурации Babel расположить преобразование TypeScript перед преобразованием декораторов, как показано ниже:

{
  "assumptions": {
    "setPublicClassFields": true
  },
  "plugins": [
    ["@babel/plugin-transform-typescript", {
      "allowDeclareFields": true
    }],
    ["@babel/plugin-proposal-decorators", {
      "version": "2018-09",
      "decoratorsBeforeExport": true
    }],
    ["@babel/plugin-proposal-class-properties"]
  ]
}

Параметр allowDeclareFields обычно не требуется, но он может быть полезен, если нужно определить реактивное свойство без использования декоратора. Например:

static properties = { foo: {} };

declare foo: string;

constructor() {
  super();
  this.foo = 'bar';
}

Как избежать проблем с полями классов и декораторами

Поля классов могут приводить к проблемам при объявлении реактивных свойств. Дополнительную информацию см. в разделе Как избежать проблем с полями классов при объявлении свойств.

Текущее предложение 3-го этапа о декораторах напрямую не решает эту проблему, но она должна быть устранена по мере развития и доработки предложения.

При использовании декораторов необходимо правильно настроить параметры транспилятора Babel и TypeScript, как показано выше в разделах о TypeScript и Babel.

Редактировать эту страницу

© Google LLC
Licensed under the Creative Commons Attribution 3.0 Unported License.
https://lit.dev/docs/v2/components/decorators/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API