如何使用Vue.js和TypeScript编写基于类的组件
介绍
Vue.js 2 支持类样式组件。 如果您来自 Angular (2+) 背景,您可能熟悉将组件编写为类的模式,使用属性和装饰器来描述组件的更复杂部分。
类样式组件相对于标准 Vue.js 组件的最大优势在于,它们使 this 在编译组件中实际指向的位置更清晰,并允许更简洁的代码。
在本文中,您将了解如何在 Vue.js 基于类的组件中使用 vue-class-component
和 vue-property-decorator
来支持 TypeScript。
先决条件
要阅读本文,您将需要:
- Node.js 安装在本地,您可以按照【X57X】如何安装Node.js 并创建本地开发环境【X126X】进行。
- 熟悉 设置 Vue.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 项目:
npx @vue/cli create vue-typescript-example
出于本教程的目的,配置将需要:
迅速的 | 选项 |
---|---|
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
。
然后,导航到项目目录:
cd vue-typescript-example
此时,您已经为 TypeScript 和类样式组件设置了 Vue.js 项目。
第 2 步 — 使用 TypeScript 编写单文件组件
一个类组件是一个 TypeScript class
,即 extends
Vue
对象。 在单文件组件中,确保将 <script>
语言设置为 ts
并将类导出为 default
。
在代码编辑器中打开 App.vue
并使用 TypeScript 创建这个示例单文件组件:
src/App.vue
<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
将被更新并反映所做的更改。
第三步——使用组件道具
通过使用 vue-property-decorator
中的 @Prop(config)
装饰器,您可以像声明数据属性一样声明输入属性。
这是 TypeScript 中的一个示例,它采用 exampleProperty
组件属性,默认值为 'Input Property'
:
src/App.vue
<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 步 — 使用计算属性
计算属性在类上写为 getters
和 setters
。
这是 TypeScript 中的一个示例,它 get
sa myComputedProp
并返回一个随机数:
src/App.vue
<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() } } }
此时,如果您要在浏览器中编译和观察您的应用程序,您将看到一个随机数。
第五步——使用观察者
可以使用 @Watch(propertyString, config)
装饰器创建观察者。
以下是 TypeScript 中的一个示例,用于监视 myWatchedProperty
何时触发 onPropertyChanged
:
src/App.vue
<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 } } }
此时,如果您要在浏览器中编译和观察您的应用程序,您将看到一个输入字段。 更改输入值将显示消息 Watched Property Changed
。
结论
在本文中,您学习了如何使用 vue-class-component
和 vue-property-decorator
在 Vue.js 基于类的组件中支持 TypeScript。
本文介绍了@Component
、get
和set
。 有关 vue-class-component
中可用声明的完整列表,请参阅 官方文档 。
本文还介绍了@Prop
和@Watch
。 有关 vue-property-decorator
中可用的装饰器的完整列表,请参阅 官方文档 。
如果您想了解有关 TypeScript 的更多信息,请查看 我们的 TypeScript 主题页面 以获取练习和编程项目。