Vue装饰器写法
依赖库介绍
vue-property-derocator (官方文档)
在Vue中使用TypeScript时,非常好用的一个库,使用装饰器来简化书写,下列是它提供的一下装饰器。
1.安装 npm i -S vue-property-decorator
- @Prop
- @PropSync
- @Emit
- @Model
- @Watch
- @Provide
- @Inject
- @Component(来自vue-class-component库的vue-class-component)
- Mixins方法(来自vue-class-component库mixins)
vuex-class(官方文档)
vuex-class可以包装vuex的写法,使代码简化,它提供了4个装饰器和namespace
1.安装 npm i --save vuex-class or yarn add vuex-class
- @State
- @Getter
- @Mutation
- @Action
- namespace
vue-class-component(官方文档)
是Vue的官方库,支持以class的方式来写vue代码,它支持下列写法
1.安装 npm i --save vue-class-component
- methods可以直接声明类的成员方法
- 计算属性可以被声明为类的属性访问器
- 初始化的data可以被声明为类属性
- data、render已经所有的Vue生命周期钩子可以作为类的成员方法
- 提供的装饰器Component和处理mixins写法的方式mixins
- 所有其他属性需要放在装饰器Component
导入和使用
1
2
3
4
5
6
7
8
9// 导入部分 import Component, { mixins } from 'vue-class-component' // 如果用到了vue-property-decorator库,建议只使用一个库导入,避免Component在项目中频繁从两个不同的库中读取 import { Component, Prop, Vue } from 'vue-property-decorator' // 使用部分,@Component必写 @Component export default class HelloWorld extends Vue {}
vue-class-component
装饰器写法 data与methods直接定义为类的属性即可,computed需要定义为访问器属性,mixins方法原本通过mixins属性导入改为通过继承
类组件
@Component 装饰器使您的类成为Vue组件
1
2
3
4
5
6
7import Vue from 'vue' import Component from 'vue-class-component' // Hello 类将是vue的组建 @Component export default class Hello extends Vue {}
data
1
2
3
4
5
6@Component export default class Hello extends Vue { // data可以直接声明为类属性 message = 'Hello World!' }
methods
1
2
3
4
5
6
7
8@Component export default class Hello extends Vue { // methods可以直接声明为类方法 hello() { console.log('Hello World!') } }
computed
1
2
3
4
5
6
7
8
9
10
11
12
13@Component export default class Hello extends Vue { name = 'John' // computed声明为类属性getter / setter get name() { return this.name } set name(value) { this.name= value } }
生命周期钩子
1
2
3
4
5
6
7
8
9@Component export default class HelloWorld extends Vue { // 所有Vue生命周期挂钩也可以直接声明为类原型方法,但是您不能在实例本身上调用它们。 // 声明自定义方法时,应避免使用这些保留名称。 mounted() { console.log('mounted') } }
注册钩子
使用Vue Router等Vue插件,可能希望类组件解析它们提供的钩子
在这种情况下,Component.registerHooks允许注册钩子
注册钩子后,类组件将它们实现为类原型方法
注意:必须在组件定义之前对其进行注册
1
2
3
4
5
6
7import Component from 'vue-class-component' Component.registerHooks([ 'beforeRouteEnter', 'beforeRouteLeave', 'beforeRouteUpdate' ])
原写法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17export default { data () { return { msg: 'msg' } }, methods: { hello () {} }, mounted() {}, computed: { newmsg () { return 'new ' + this.msg } } }
mixins
Vue类组件提供了mixins辅助功能,以类样式方式使用mixins。通过使用mixins帮助程序,TypeScript可以推断混合类型并在组件类型上继承它们。
注意:所有mixin必须声明为类组件
1
2
3
4
5
6
7
8
9
10
11
12
13// mixins.js import Vue from 'vue' import Component from 'vue-class-component' @Component export class Hello extends Vue { hello = 'Hello' } @Component export class World extends Vue { world = 'World' }
1
2
3
4
5
6
7
8
9
10import Component, { mixins } from 'vue-class-component' import { Hello, World } from './mixins' @Component export class HelloWorld extends mixins(Hello, World) { created () { console.log(this.hello + ' ' + this.world + '!') } }
其他的部分(components、fliter、directives、Prop、Watch等)
原写法
1
2
3
4
5
6
7
8export default { components: {}, props: {}, watch: { msg (newVal, oldVal) {} } }
装饰器写法 其余的部分全部包裹在@Component装饰器中
1
2
3
4
5
6
7
8
9
10// 对于所有其他选项,将它们传递给装饰器函数 @Component({ components: {}, props: {}, watch: { new (newVal, oldVal) {} } }) export default class HelloWorld extends Vue {}
props
Vue类组件没有提供用于props定义的专用API。但是,可以通过Vue.extend来实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14const GreetingProps = Vue.extend({ props: { name: String } }) @Component export default class Greeting extends GreetingProps { get message(): string { // this.name will be typed return 'Hello, ' + this.name } }
extends 被占用了,如果想继承类组件或者混入时,可以使用mixins来实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import Vue from 'vue' import Component, { mixins } from 'vue-class-component' import Super from './super' const GreetingProps = Vue.extend({ props: { name: String } }) @Component export default class Greeting extends mixins(GreetingProps, Super) { get message(): string { return 'Hello, ' + this.name } }
$refs
$refs组件的类型声明为处理所有可能的ref类型的最广泛的类型。虽然理论上是正确的,但在大多数情况下,每个ref在实践中仅具有特定的元素或组件。
可以通过覆盖$refs类组件中的类型来指定特定的引用类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<template> <input ref="input"> </template> @Component export default class InputFocus extends Vue { // `!` (显式赋值断言,就是由用户自己保证,这个属性在使用前会初始化,类型检查不管这个属性了) // 这样就可以消除编译错误 $refs!: { input: HTMLInputElement } mounted() { this.$refs.input.focus() } }
vuex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import Vue from 'vue' import Component from 'vue-class-component' import { mapGetters, mapActions } from 'vuex' import { Post } from './post' @Component({ computed: mapGetters([ 'posts' ]), methods: mapActions([ 'fetchPosts' ]) }) export default class Posts extends Vue { posts!: Post[] fetchPosts!: () => Promise<void> mounted() { this.fetchPosts().then(() => { console.log(this.posts) }) } }
最后
以上就是孤独电灯胆最近收集整理的关于Vue装饰器写法-vue-class-componentVue装饰器写法的全部内容,更多相关Vue装饰器写法-vue-class-componentVue装饰器写法内容请搜索靠谱客的其他文章。
发表评论 取消回复