vue中使用vue-property-decorator

2023-09-15 11:35:22

一、前言

Vue.js 是一个非常受欢迎的前端框架,它能够快速构建交互性强的单页面应用。而 vue-property-decorator 是一个用于 Vue.js 的装饰器库,可以帮助我们更方便地编写 Vue.js 组件。下面来详细讲解 vue-property-decorator 的用法。

vue-class-component 是 vue 的官方库,作用是用类的方式编写组件,这种编写方式可以让 .vue 文件的 js 结构更扁平化,并使 vue 组件可以使用继承、混入等高级特性。

目前 2.x 跟 TS 的整合,通常需要基于 vue-class-component 来用基于 class 的组件书写方式

vue英文官网推荐了一个叫vue-class-component的包,可以以class的模式写vue组件。vue-class-component(以下简称Component)带来了很多便利:
官方文档:https://class-component.vuejs.org/

vue-property-decorator是社区出的
官网 https://www.npmjs.com/package/vue-property-decorator
vue-property-decorator使我们能在vue组件中写TypeScript语法

vue-property-decorator深度依赖了vue-class-component拓展出了更多操作符 @Prop @Model @Watch @Provide @Inject @Emit等
可以说是 vue-property-decorator是 vue-class-component的一个超集
正常开发的时候,你只需要使用vue-property-decorator中提供的操作符即可 不用再从vue-class-componen引入 vue、component

装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上。 装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被调用,被装饰的声明信息做为参数传入。

二、安装

1、原项目安装
npm i -S vue-class-component
npm i -S vue-property-decorator
2、使用 vue-cli 搭建新项目

vue create hello-world
选择 “Manually select features” 来手动选择特性,
勾选上 TypeScript(因为要使用装饰器语法)
勾选 “Use class-style component syntax?”

三、使用

1、 基本写法

template和css的写法不变,只是script内的写法需要注意

<script lang='ts'>
import {Component, Vue} from vue-property-decorator;
@Component
export default class App extends Vue {

};
</script>

lang=“ts”:script声明当前语言是ts
@Component:注明此类为一个vue组件
App 组件名称
export default class Test extends Vue: export当前组件类是继承vue的

2、@component

@Component({})可以声明components、filter、directives等未提供装饰器的vue选项,也可以声明computed、watch、路由守卫函数(beforeRouteEnter、beforeRouteLeave)等

即使没有组件也不能省略@Component,否则会报错。

<template>
  <div>
    <componentA></componentA>
  </div>
</template>

<script lang="ts">
import { Vue, Component } from "vue-property-decorator";
import { componentA } from "@/components";

@Component({
  //组件
  components: {
    componentA,
  },
})
export default class HelloWorld extends Vue {
    
}
</script>
3、Data属性

data属性初始化可以被声明为类的属性。

<template>
  <div>{{ message }}</div>
</template>

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

// 即使没有组件也不能省略@Component
@Component({})
export default class HelloWorld extends Vue {
  // 定义的变量
  message: string = "Hello World!";
}
</script>
4、Methods属性

组件方法可以直接声明为类的原型方法:

<template>
  <button v-on:click="hello">Click</button>
</template>

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

@Component({})
export default class HelloWorld extends Vue {
  // 方法
  hello() {
    console.log("Hello World!");
  }
}
</script>
5、Computed 计算属性

计算属性可以声明为类属性getter/setter:
对于Vue中的计算属性,我们只需要将该计算属性名定义为一个函数,并在函数前加上get关键字即可

<template>
  <input v-model="name" />
</template>

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

@Component({})
export default class HelloWorld extends Vue {
  // 定义的变量
  firstName: string = "John";
  lastName: string = "Doe";

  // 计算属性
  get name() {
    return this.firstName + " " + this.lastName;
  }
  // 计算属性
  set name(value) {
    const splitted = value.split(" ");
    this.firstName = splitted[0];
    this.lastName = splitted[1] || "";
  }
}
</script>
6、@Watch

@Watch使用非常简单,接受第一个参数为要监听的属性名 第二个属性为可选对象
{immediate?: boolean, deep?: boolean}第一个表示监听开始后是否立即调用回调函数,第二个表示监听的属性变化时是否调用回调函数

<template>
  <button v-on:click="hello">Click</button>
</template>

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

@Component({})
export default class HelloWorld extends Vue {
  // 侦听器
  @Watch("message", { immediate: true, deep: true })
  onChangeValue(newVal: string, oldVal: string) {}

  // 定义的变量
  message: string = "Hello World!";

  // 方法
  hello() {
    this.message = "This is an test page!";
  }
}
</script>
7、@Prop

子组件接收父组件传参
@Prop接受一个参数可以是类型变量或者对象或者数组.@Prop接受的类型比如Number是JavaScript的类型,之后定义的属性类型则是TypeScript的类型
// 高阶函数接受参数,兼容以下写法

@Prop(String) name!: string | undefined;
@Prop([String, Number]) count!: string | number;
@Prop({type: Number, default: 0, (required、validator)}) age!: number;
@Prop() private name!: string;

//父组件HomeView.vue
<template>
  <div>
    <HelloWorld msg="Welcome to Your Vue.js + TypeScript App" />
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import HelloWorld from "@/components/HelloWorld.vue";

@Component({
  //组件
  components: {
    HelloWorld,
  },
})
export default class HomeView extends Vue {}
</script>
//子组件HelloWorld.vue
<template>
  <div>
    {{ msg }}
  </div>
</template>

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

@Component({})
export default class HelloWorld extends Vue {
  // 父组件传递的参数
  //这里 !和可选参数?是相反的, !告诉TypeScript我这里一定有值
  @Prop({ type: String, default: "" }) msg!: string;
}
</script>
8、@Emit

@Emit会将回调函数的返回值作为第二个参数,如果返回值为一个Promise对象,emit会在Promise-resolved后触发

@Emit(‘del’) private delEmit(e: MouseEvent){}
@Emit()//省略参数将使用回调函数名,转化为中划线@add-data
addData(data: any){return ‘’;}//如果此处不return,则使用函数参数data

//父组件HomeView.vue
<template>
  <div>
    <HelloWorld @editHandleEmit="editHandle" />
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import HelloWorld from "@/components/HelloWorld.vue";

@Component({
  //组件
  components: {
    HelloWorld,
  },
})
export default class HomeView extends Vue {
  // 方法
  editHandle(row: any) {
    console.log(row);
  }
}
</script>
//子组件HelloWorld.vue
<template>
  <div>
    <button v-on:click="editHandle">Click</button>
  </div>
</template>

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

@Component({})
export default class HelloWorld extends Vue {
  // 定义的变量
  count: number = 0;
  
  // Emit方法
  @Emit("editHandleEmit")
  private editHandle() {
    return this.count;
  }
}
</script>
9、Mixins

Vue类组件提供了mixins辅助功能,以类样式方式使用mixins。通过使用mixins帮助程序,TypeScript可以推断混合类型并在组件类型上继承它们。

注意:所有mixin必须声明为类组件。

// mixins.ts
import { Vue, Component } from 'vue-property-decorator';

//定义vue/type/vue模块
declare module 'vue/types/vue' {
    interface Vue {
        value: string;
    }
}

@Component
export default class myMixins extends Vue {
    // 定义的变量
    value: string = 'Hello'
}
//页面HelloWorld.vue
import { Vue, Component, Prop } from 'vue-property-decorator';
import myMixins from './mixins';

@Component({
    //混入
    mixins: [myMixins]
})
export default class myComponent extends Vue {
    // 生命周期
    created() {
        console.log(this.value) // => Hello
    }
}

总结

  1. methods,钩子都可以直接写作class的方法
  2. computed属性可以直接通过get来获得
  3. 初始化data可以声明为class的属性
  4. 其他的都可以放到Component装饰器里
更多推荐

【云原生】k8s存储管理中ConfigMap & Secret的使用

目录1ConfigMap1.1简介1.2优点1.3定义ConfigMap1.4使用2Secret2.1简介2.1定义Secret2.2使用1ConfigMap1.1简介在Kubernetes中,ConfigMap是一种用于存储非敏感信息的Kubernetes对象。它用于存储配置数据,如键值对、整个配置文件或JSON数据

【K8S系列】Weave Net 故障排除的常见问题和解决方案

写在前面当使用WeaveNet进行容器网络配置时,可能会遇到一些常见的故障情况。以下是一些常见问题及其解决方案:问题列表1节点无法加入WeaveNet网络解决方案检查节点之间的网络连通性,确保可以通过IP地址相互访问。检查节点的防火墙设置,确保允许WeaveNet的流量通过。确保在每个节点上正确安装了WeaveNet,

04-前端基础CSS第二天

01-CSS第二天导读目标:能使用emmet语法能够使用CSS复合选择器能够写出伪类选择器的使用规范能够说出元素有几种显示模式能够写出元素显示模式的相互转换代码能够写出背景图片的设置方式能够计算CSS的权重目录:Emmet语法CSS的复合选择器CSS的元素显示模式CSS的背景CSS的三大特性CSS的注释02-emmet

在字节当了几个月的牛马,醒悟了。

作者:阿秀InterviewGuide大厂面试真题网站:https://top.interviewguide.cn小伙伴们大家好,我是阿秀。以前也分享过不少实习体验,比如去年就分享了一位师弟的美团实习体验:美团实习三个月,我受益良多,今天来分享一下一位学习圈中学弟的字节实习体验。他周围同事都是硕士起步,只有他是双非本,

Java毕业设计-基于SpringBoot的租房网站的设计与实现

大家好,今天为大家打来的是基于SpringBoot的租房网站的设计与实现博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文章目录一、前言介绍二、主要技术三、系统设计(部分)3.1、主要功能模块设计3.

普中51-矩阵按键

矩阵按键原理图如下:行列扫描行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所

Web自动化测试理解

最近几天,由于工作需要接触Web自动化测试,所以我从网上找的资料,学习了解,然后自己总结汇总的随笔,如文章中有不足的地方,请大家多多指教;或者文章内容与他人相似,望见谅。手工测试跟自动化测试区别:手工测试:就是由人去一个一个输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一个步骤。自动化测试:自动化测试

植隆业务中台与金蝶云星空对接集成服务工单查询接口连通应收单新增(6202-开票申请(代理商-销售类))

植隆业务中台与金蝶云星空对接集成服务工单查询接口连通应收单新增(6202-开票申请(代理商-销售类))数据源系统:植隆业务中台承载了企业核心关键业务,是企业的核心业务能力,也是企业数字化转型的重点。业务中台的建设目标是:“将可复用的业务能力沉淀到业务中台,实现企业级业务能力复用和各业务板块之间的联通和协同,确保关键业务

竞赛选题 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录1前言2情感文本分类2.1参考论文2.2输入层2.3第一层卷积层:2.4池化层:2.5全连接+softmax层:2.6训练方案3实现3.1sentence部分3.2filters部分3.3featuremaps部分3.41max部分3.5concat1max部分3.6关键代码4实现效果4.1测试英文情感分类效果

72、Spring Data JPA 的 Specification 动态查询

Specification:规范、规格★Specification查询它也是SpringData提供的查询——是对JPA本身Criteria动态查询的包装。▲为何要有动态查询页面上常常会让用户添加不同的查询条件,程序就需要根据用户输入的条件,动态地组合不同的查询条件。JPA为动态查询提供了Criteria查询支持。Sp

基于SpringBoot的驾校管理系统

基于SpringBoot+Vue的驾校管理系统、前后端分离开发语言:Java数据库:MySQL技术:SpringBoot、Vue、MybaitsPlus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven【主要功能】角色:管理员、用户、教练管理员:学员管理、教练管理、驾校信息管理、报名信息管理

热文推荐