首先 下載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>
此文長期慢慢累積