Pesquisa de site

Como escrever componentes baseados em classe com Vue.js e TypeScript


Introdução

Vue.js 2 suporta componentes de estilo de classe. Se você tem experiência em Angular (2+), provavelmente está familiarizado com o padrão de escrever componentes como classes usando propriedades e decoradores para descrever partes mais complexas de seu componente.

A maior vantagem que os componentes de estilo de classe têm sobre os componentes Vue.js padrão é que eles tornam mais claro para onde isso realmente aponta no componente compilado e permitem um código mais conciso.

Neste artigo, você será apresentado ao uso de vue-class-component e vue-property-decorator para oferecer suporte a TypeScript em componentes baseados em classe Vue.js.

Pré-requisitos

Para acompanhar este artigo, você precisará de:

  • Node.js instalado localmente, o que você pode fazer seguindo Como instalar o Node.js e criar um ambiente de desenvolvimento local.
  • Alguma familiaridade com componentes de arquivo único.
  • Alguma familiaridade com as convenções do TypeScript.

Este tutorial foi verificado com 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 e vue-property-decorator v8.4.2.

Passo 1 — Configurando o Projeto

Você precisará de vue-class-component e vue-property-decorator instalados.

Você pode usar @vue/cli para criar um novo projeto Vue.js:

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

Para os fins deste tutorial, a configuração exigirá:

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 instalará typescript, vue-class-component e vue-property-decorator.

Em seguida, navegue até o diretório do projeto:

  1. cd vue-typescript-example

Neste ponto, você tem um projeto Vue.js configurado para TypeScript e componentes de estilo de classe.

Etapa 2 — Escrevendo um componente de arquivo único com TypeScript

Um componente de classe é uma classe do TypeScript que estende o objeto Vue. Em componentes de arquivo único, certifique-se de definir a linguagem <script> como ts e exportar a classe como default.

Abra App.vue em seu editor de código e crie este exemplo de componente de arquivo único com 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>

Observe que as propriedades de dados são definidas diretamente na classe e nos métodos.

O decorador @Component(componentConfig) é o que torna isso possível. Ele transforma a classe em um formato que o Vue.js pode entender durante o processo de compilação.

Neste ponto, se você fosse compilar e observar seu aplicativo em um navegador, seria apresentado a você um campo de entrada e a palavra Data Property. Ao interagir com o campo de entrada, myDataProperty será atualizado e refletirá as alterações feitas.

Etapa 3 — Usando acessórios de componentes

Através do uso do decorador @Prop(config) de vue-property-decorator, você pode declarar propriedades de entrada da mesma forma que as propriedades de dados.

Aqui está um exemplo em TypeScript que usa uma exampleProperty uma propriedade de componente com o valor padrão de 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>

Em JavaScript, isso é equivalente a:

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

Neste ponto, se você fosse compilar e observar seu aplicativo em um navegador, seria apresentada a mensagem: Input Property.

Etapa 4 — Usando propriedades calculadas

As propriedades computadas são escritas como getters e setters na classe.

Aqui está um exemplo em TypeScript que get é um myComputedProp e retorna um número aleatório:

<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>

Em JavaScript, isso é equivalente a:

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

Nesse ponto, se você fosse compilar e observar seu aplicativo em um navegador, seria apresentado a você um número aleatório.

Passo 5 — Usando observadores

Os observadores podem ser criados com o decorador @Watch(propertyString, config).

Aqui está um exemplo em TypeScript que observa quando myWatchedProperty aciona 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>

Em JavaScript, isso é equivalente a:

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

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

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

Nesse ponto, se você fosse compilar e observar seu aplicativo em um navegador, seria apresentado um campo de entrada. Alterar o valor de entrada exibirá a mensagem Watched Property Changed.

Conclusão

Neste artigo, você aprendeu como usar vue-class-component e vue-property-decorator para oferecer suporte a TypeScript em componentes baseados em classe Vue.js.

Este artigo apresentou @Component, get e set. Para obter uma lista completa de declarações disponíveis em vue-class-component, consulte a documentação oficial.

Este artigo também apresentou @Prop e @Watch. Para obter uma lista completa de decoradores disponíveis em vue-property-decorator, consulte a documentação oficial.

Se você quiser saber mais sobre o TypeScript, confira nossa página de tópicos do TypeScript para ver exercícios e projetos de programação.

Artigos relacionados: