初始模板

import { Componenet, Vue } from 'vue-property-decorator'

@Component
export default class CompnentName extends Vue {
}

@Component 和 下面的类是不相通的,他们都可以在 template 里使用,但是不能互相操作,@Component里设置data...,那么在template里可以取到,但class 里不能;反之同理

@Component({
  // 就像普通vue2一样,vue所有的api都可以写在这里name,components,props,provide,inject,watch,filters,data,生命周期函数,method,computed....
  // 但是全写在这里,ts的用处就几乎体现不出来了,为此,data,各种类型函数可以酌情写在下面的类里
})

interface User {
  id?: string
  firstname?: string
  lastname?: string
  gender?: number
}

export default class CompnentName extends Vue {
  
  //data
  userInfo: User = {}

  //method
  getUserInfo() {
    Axios.get('/userinfo').then((userinfo: User) => {
      this.userInfo = userinfo
    }).catch((reson: string) => {
      //......
    })
  }
  //computed       必须用 get 标注
  get fullName():string {
    return this.userInfo.firstnaem + this.userInfo.lastname
  }
  
  //ref
  <div @click="printMyDiv" ref="myDiv"></div>
  @Ref('myDiv') readonly custiomRefname!: HTMLElement
  printMyDiv() {
    console.log(custiomRefname)
  }
  
  //prop
  @Prop({from: 'propsname', {default: 'default value'}}) readonly customName!: string
  //propSync
  @PropSync({from: 'propsname', {default: 'default value'}}) readonly customName!: string

  //watch()
  @Watch('name', { immediate: true, deep:true})
  onWatchHandel(newValue: string, oldValue: string):void {  //自定义名字,上面watch的函数
    console.log(newValue, oldValuw)
  }

  //provide
  @Provide('custom-name')
  coutomName = 'msg was provide'

  //inject
  @Inject({from: 'custom-name'}) readonly customName!: string
}

Emit比较特别

先传return,后传参数
普通函数是执行完后再emit,异步函数是在then/catch里emit

import { Vue, Component, Emit } from 'vue-property-decorator'

@Component
export default class YourComponent extends Vue {
    count: number = 0
    @Emit()
    addToCount(n:number) {
        this.count += n
    }
    
    @Emit('reset')
    resetCount() {
        this.count = 0
    }
    
    @Emit()
    returnValue() {
        return 10
    }
    
    @Emit()
    onInputChange(e) {
        return e.target.value
    }
    
    @Emit()
    promise() {
        return new Promise((resolve) => {
            setTimeout(() => {
                resolve(20)
            }, 0)
        })
    }
}
// 以上会解析为:
export default {
    data() {
        return {
            count: 0
        }
    },
    methods: {
      addToCount(n) {
          this.count += n
          this.$emit('add-to-count', n)
      },
      resetCount() {
          this.count = 0
          this.$emit('reset')
      },
      returnValue() {
          this.$emit('return-value', 10)
      },
      onInputChange() {
          this.$emit('on-input-change', e.target.value, e)      //先传return,后传参数
      },
      promise() {
          // 普通函数是执行完后再emit,异步函数是在then/catch里emit
          new Promise((resolve) => {
              setTimeout(() => {
                  resolve(20)
              }, 0)
          }).then((value) => {
              this.$emit('promise', value)
          })
      }
  }
}

Mixins

Mixins文件夹下 > Goods.vue
<script lang='ts'>
import { Vue, Component } from 'vue-property-decorator'
@Component
export default class Goods extends Vue {
  goodList = ['apple', 'tea', 'book', 'watch']
}
</script>


引入使用
import Goods from '../Mixins/Goods.vue'
import { Component, Mixins } from 'vue-property-decorator'

export default class Home extends Mixins(Goods) {   //多个mixin用逗号隔开  Mixins(Goods, Price)
   //就可以直接使用Goods中定义的变量了
}

vue内部的装饰器就这些:

posted on 2022-06-16 21:18  In-6026  阅读(18)  评论(0编辑  收藏  举报

导航