TypeScript+Vue 插件vue-property-decorator的使用總結

首先 下載javascript

npm install vue-class-component vue-property-decorator --save-dev

一梭子直接幹;css

其次,咱來講說它們的區別與聯繫:html

vue-property-decorator社區出品;vue-class-component官方出品vue

vue-class-component提供了Vue、Component等;java

vue-property-decorator深度依賴了vue-class-component,拓展出了更多操做符:@Prop、@Emit、@Inject、@Model、@Provide、@Watch;vuex

開發時正常引入vue-property-decorator就行npm

引入後寫vue代碼就是如此,ide

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

@Component
export default class App extends Vue {
  name:string = 'Simon Zhang'

  // computed
  get MyName():string {
    return `My name is ${this.name}`
  }

  // methods
  sayHello():void {
    alert(`Hello ${this.name}`)
  }

  mounted() {
    this.sayHello();
  }
}

至關於函數

export default {
  data () {
    return {
      name: 'Simon Zhang'
    }
  },

  mounted () {
    this.sayHello()
  },

  computed: {
    MyName() {
      return `My name is ${this.name}`
    }
  },

  methods: {
    sayHello() {
      alert(`Hello ${this.name}`)
    },
  }
}

大佬都說爽的一批;flex

然鵝菜鳥我遇到問題一堆,如下作個積累總結:

一、寫法問題:引入組件和接收父組件傳過來的參數

@Component({
  components: {
    XXXX
  },
  props: {
    mapFlag: Number
  }
})

二、獲取refs,在其後面加上as HTMLDivElement(不知道是否是這插件引發的,懶得管,直接幹就是)

let layoutList:any = this.$refs.layout as HTMLDivElement
或
let fieldCalculate:any = (this as any).$refs.fieldCalculate

三、ts文件 公用方法導出

const xxx = (value: any, type: string) => {
  ...
}
export { xxx, xxx, xxx, xxx }

四、引入裝飾器,使用方式@Watch

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

五、引用插件。在shims-vue.d.ts 文件中聲明,再在組件中引用

declare module 'vuedraggable' {
  const vuedraggable: any;
  export default vuedraggable;
}

六、@Watch使用

// 監聽formula 其變化則顯示驗證公式按鈕
    @Watch('formula', { deep: true, immediate: true }) formulaWatch (newVal:string, oldVal:string) {
      if (newVal !== oldVal) {
       this.grammarSuccess = true
       this.errMsgFlag = false
       this.checkFormulaSuccess = false
      }
    }

七、計算屬性方法寫法(跟@watch同樣,當成方法寫就行;加一個關鍵字get)

get aTagDatasFcomput () { // computed計算屬性, 過濾出visible爲true的對象來渲染,由於當 v-if 與 v-for 一塊兒使用時,v-for 具備比 v-if 更高的優先級,這意味着 v-if 將分別重複運行於每一個 v-for 循環中
      return this.aTagDatasF.filter(item => item.visible)
}

八、@Prop的用法

@Prop({
      type: Boolean, // 父組件傳遞給子組件的數據類型
      required: false, // 是否必填
      default: false // 默認值, 若是傳入的是 Object,則要 default: ()=>({}) 參數爲函數
  }) collapsed !: boolean
@Prop()private datas!: any

感嘆號是非null和非undefined的類型斷言,因此上面的寫法就是對datas這個屬性進行非空斷言

九、ts設置html的fontSize

獲取時:(不加會報錯Object is possibly 'null'.  真是一波騷操做)

let docEl = document.documentElement as HTMLDivElement // 加上 as HTMLDivElement

十、vuex-class的簡單使用(簡單的提示彈窗)

    首先在store.ts中命名一個state和mutations方法,例:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    tips: {
      show: false,
      title: ''
    }
  },
  changeTips: {
   selectOption (state, tips) {
      state.tips = tips
      setTimeout(() => {
        state.tips.show = false
      }, 1500)
    }
  }
})

而後在頁面中引入 

import { State, Mutation } from 'vuex-class' // vuex-class

@Mutation changeTips: any // 引入該方法

this.changeTips({ show: true, title: '請選擇沙雕' }) // 使用

該組件寫法

<template>
  <!-- 提示彈層 -->
  <div class="tips" v-show="tips.show">
    <h3>{{tips.title}}</h3>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { State } from 'vuex-class'

@Component
export default class Tips extends Vue {
  // @State('tips') stateTips: any
  @State tips: any
}
</script>
<style  lang="scss" scoped>
.tips{
  display: flex;
  justify-content: center;
  flex-direction: column;
  align-items: center;
  position: fixed;
  left: 0;
  top: 0;
  z-index: 999;
  width: 100%;
  height: 100%;
  color: #fff;
  h3{
    padding: .08rem .2rem;
    max-width: 80%;
    font-size: .12rem;
    font-weight: 400;
    background-color: rgba(0,0,0,0.6);
    border-radius: 4px;
  }
}
</style>

 

 

此文長期慢慢累積

相關文章
相關標籤/搜索