vue-class-component

作者: charllote8 | 来源:发表于2019-10-28 20:29 被阅读0次

    vue-class-component 是尤大大推出的vue对typescript支持的装饰器(库)

    vue-class-component强调了几点用法:

    1、methods可以直接声明为类成员方法
    2、computed属性可以声明为类属性访问器
    3、data数据可以声明为类属性
    4、data render 和所有Vue生命周期挂钩也可以直接声明为类成员方法,但不能在实例本身上调用它们。在声明自定义方法时,应避免使用这些保留名称。

    使用方法

    官网demo

    <script>
    import Vue from 'vue'
    import Component from 'vue-class-component'
    
    @Component({
      props: {
        propMessage: String
      }
    })
    export default class App extends Vue {
      // 初始化数据 data可以声明成类属性形式
      msg = 123
    
      // 使用props
      helloMsg = 'Hello, ' + this.propMessage
    
      // 生命周期钩子声明  保留名称
      mounted () {
        this.greet()
      }
    
      // computed属性可以声明成类方法形式
      get computedMsg () {
        return 'computed ' + this.msg
      }
    
      // method方法可以声明成类方法形式
      greet () {
        alert('greeting: ' + this.msg)
      }
    }
    </script>
    

    createDecorator

    createDecorator可以自定义装饰器,需要接受一个回调函数作为第一个参数,包括以下几个参数

    options:对象参数, key ,paramsIndex
    
    // decorators.js
    import { createDecorator } from 'vue-class-component'
    
    export const NoCache = createDecorator((options, key) => {
      // component options should be passed to the callback
      // and update for the options object affect the component
      options.computed[key].cache = false
    })
    import { NoCache } from './decorators'
    
    @Component
    class MyComp extends Vue {
      // computed属性不会再被缓存
      @NoCache
      get random () {
        return Math.random()
      }
    }
    

    Component.registerHooks

    自定义钩子

    // class-component-hooks.js
    import Component from 'vue-class-component'
    
    // 注册钩子name
    Component.registerHooks([
      'beforeRouteEnter',
      'beforeRouteLeave',
      'beforeRouteUpdate' // for vue-router 2.2+
    ])
    // MyComp.js
    import Vue from 'vue'
    import Component from 'vue-class-component'
    
    @Component
    class MyComp extends Vue {
      beforeRouteEnter (to, from, next) {
        console.log('beforeRouteEnter')
        next() // needs to be called to confirm the navigation
      }
    
      beforeRouteLeave (to, from, next) {
        console.log('beforeRouteLeave')
        next() // needs to be called to confirm the navigation
      }
    }
    

    箭头函数

    this为undefined,
    原本使用箭头函数的this实际上指向的是vue实例,
    但是将箭头函数定义为类属性并在其中访问它,则它将不起作用,this指向的是vue实例的代理

    @Component
    class MyComp extends Vue {
      foo = 123
      bar = () => {
        this.foo = 456
      }
    }
    
    

    只要将函数定义为方法,就会自动生成vue实例

    @Component
    class MyComp extends Vue {
      foo = 123
    
      bar () {
        // Correctly update the expected property.
        this.foo = 456
      }
    }
    

    类属性的undefined没有做出处理

    对于一些属性的初始值应该用null或者data钩子进行处理

    @Component
    class MyComp extends Vue {
      // 不会进行处理
      foo = undefined
    
      // 会进行处理
      bar = null
    
      data () {
        return {
          // 会进行处理
          baz: undefined
        }
      }
    }
    

    相关文章

      网友评论

        本文标题:vue-class-component

        本文链接:https://www.haomeiwen.com/subject/thqivctx.html