我是靠谱客的博主 孤独电灯胆,这篇文章主要介绍Vue装饰器写法-vue-class-componentVue装饰器写法,现在分享给大家,希望可以做个参考。

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
7
import 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
7
import 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
17
export 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
10
import 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
8
export 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
14
const 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
17
import 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
24
import 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装饰器写法内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部