Поиск по сайту:

Как писать компоненты на основе классов с помощью Vue.js и TypeScript


Введение

Vue.js 2 поддерживает компоненты в стиле классов. Если вы пришли из Angular (2+), вы, вероятно, знакомы с шаблоном написания компонентов в виде классов, использующих свойства и декораторы для описания более сложных частей вашего компонента.

Самое большое преимущество компонентов в стиле классов по сравнению со стандартными компонентами Vue.js заключается в том, что они делают более ясным, где this фактически указывает в скомпилированном компоненте, и позволяют использовать более краткий код.

В этой статье вы познакомитесь с использованием vue-class-component и vue-property-decorator для поддержки TypeScript в компонентах на основе классов Vue.js.

Предпосылки

Чтобы следовать этой статье, вам понадобятся:

  • Node.js установлен локально, что можно сделать, следуя инструкциям по установке Node.js и созданию локальной среды разработки.
  • Некоторое знакомство с компонентами одного файла.
  • Некоторое знакомство с соглашениями TypeScript.

Это руководство было проверено с помощью Node v15.1.0, npm v6.14.8, Vue.js v2.6.11, TypeScript v3.9.3, @vue/cli v4.5.0, vue-class-component v7.2.3 и vue-property-decorator v8.4.2.

Шаг 1 — Настройка проекта

Вам потребуется установить vue-class-component и vue-property-decorator.

Вы можете использовать @vue/cli для создания нового проекта Vue.js:

  1. npx @vue/cli create vue-typescript-example

Для целей этого руководства конфигурация потребует:

Prompt Option
Please pick a preset Manually select features
Check the features needed for your project TypeScript
Use class-style component syntax? Yes

@vue/-plugin-typescript установит typescript, vue-class-component и vue-property-decorator.

Затем перейдите в каталог проекта:

  1. cd vue-typescript-example

На данный момент у вас есть проект Vue.js, настроенный для компонентов TypeScript и стиля класса.

Шаг 2 — Написание однофайлового компонента с помощью TypeScript

Компонент класса — это класс TypeScript, который расширяет объект Vue. В однофайловых компонентах убедитесь, что вы установили язык <script> на ts и экспортируете класс как default.

Откройте App.vue в редакторе кода и создайте этот пример однофайлового компонента с помощью TypeScript:

<template>
  <div>
    <label>Update myDataProperty
      <input :value="myDataProperty" @input="updateMyProperty($event)"/>
    </label>
    <div>{{ myDataProperty }}</div>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component
export default class App extends Vue {
  // Data property
  myDataProperty: string = 'Data Property'

  // Component method
  updateMyProperty ($event: { target: { value: string } }) {
    this.myDataProperty = $event.target.value
  }
}
</script>

Обратите внимание, что свойства данных определяются непосредственно в классе и методах.

Это возможно благодаря декоратору @Component(componentConfig). Он преобразует класс в формат, понятный Vue.js в процессе компиляции.

На этом этапе, если бы вы скомпилировали и наблюдали за своим приложением в браузере, вам было бы представлено поле ввода и слово Data Property. При взаимодействии с полем ввода myDataProperty будет обновляться и отражать внесенные изменения.

Шаг 3 — Использование свойств компонента

Используя декоратор @Prop(config) из vue-property-decorator, вы можете объявлять входные свойства почти так же, как свойства данных.

Вот пример на TypeScript, который принимает exampleProperty свойство компонента со значением по умолчанию Input Property:

<template>
  <div>{{ exampleProperty }}</div>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'

@Component
export default class App extends Vue {
  @Prop({ default: 'Input Property' })
  exampleProperty!: string
}
</script>

В JavaScript это эквивалентно:

export default {
  props: {
    exampleProperty: {
      type: String,
      default: 'Input Property'
    }
  }
}

На этом этапе, если бы вы скомпилировали и просмотрели свое приложение в браузере, вам было бы представлено сообщение: Input Property.

Шаг 4 — Использование вычисляемых свойств

Вычисляемые свойства записываются как геттеры и сеттеры в классе.

Вот пример на TypeScript, который получает с myComputedProp и возвращает случайное число:

<template>
  <div>{{ myComputedProp }}</div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component
export default class App extends Vue {
  get myComputedProp() {
    return Math.random()
  }
}
</script>

В JavaScript это эквивалентно:

export default {
  computed: {
    myComputedProp() {
      return Math.random()
    }
  }
}

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

Шаг 5 — Использование наблюдателей

Наблюдатели могут быть созданы с помощью декоратора @Watch(propertyString, config).

Вот пример на TypeScript, который отслеживает, когда myWatchedProperty запускает onPropertyChanged:

<template>
  <div>
    <label>Update myWatchedProperty
      <input :value="myWatchedProperty" @input="updateMyProperty($event)"/>
    </label>
    <div>{{ myWatchedPropertyStatus }}</div>
  </div>
</template>

<script lang="ts">
import { Component, Watch, Vue } from 'vue-property-decorator'

@Component
export default class App extends Vue {
  myWatchedProperty: string = 'Watched Property'
  myWatchedPropertyStatus: string = ''

  @Watch('myWatchedProperty')
  onPropertyChanged(value: string, oldValue: string) {
    this.myWatchedPropertyStatus = 'Watched Property Changed'
  }

  updateMyProperty ($event: { target: { value: string } }) {
    this.myWatchedProperty = $event.target.value
  }
}
</script>

В JavaScript это эквивалентно:

export default {
  data() {
    return {
      myWatchedProperty: null
    }
  }

  methods: {
    onPropertyChanged(value, oldValue) {
      // ...
    }
  }

  watch: {
    myWatchedProperty: {
      handler: 'onPropertyChanged',
      immediate: false,
      deep: true
    }
  }
}

На этом этапе, если бы вы скомпилировали и наблюдали за своим приложением в браузере, вам было бы представлено поле ввода. Изменение входного значения отобразит сообщение Просматриваемое свойство изменено.

Заключение

В этой статье вы узнали, как использовать vue-class-component и vue-property-decorator для поддержки TypeScript в компонентах на основе классов Vue.js.

В этой статье представлены @Component, get и set. Полный список объявлений, доступных в vue-class-component, см. в официальной документации.

В этой статье также представлены @Prop и @Watch. Полный список декораторов, доступных в vue-property-decorator, см. в официальной документации.

Если вы хотите узнать больше о TypeScript, посетите нашу страницу темы TypeScript, где вы найдете упражнения и проекты по программированию.