用 Vue+ TypeScript 开发页面

 

1.创建项目

  • vue create my-ts ,my-ts就是所创建的项目的名称
  • vue create my-ts
  • 选择 Manually select features 回车确认
  • 选择typescript  vuex   router  babel  css  pre-processors  Linter/Formatter 空格键选中和取消,回车确认
  • linter配置选择  ESLint+Prettier

2.开始编码

import { Vue, Component, Prop, Provide, Inject, Model, Watch, Emit, Mixins } from 'vue-property-decorator'

(1)Vue 实际上就是 Vue 本身,用来继承vue相关属性和函数 

(2)@Component 声明成一个vue的组件实例,不使用的话,就不能得到一个vue组件

 

import { Component, Vue } from "vue-property-decorator";

// 不需要定义额外内容

@Component
export default class MyComponent extends Vue {}

 

import { Component, Vue } from "vue-property-decorator";

import bank102 from "@/assets/image/bank-list/102_GongShang.png";
import bank103 from "@/assets/image/bank-list/103_NongYe.png";
import bank104 from "@/assets/image/bank-list/104_ZhongGuo.png";

// 需要定义一些相关内容

@Component({
     /* 这里和js版本编写的 vue 组件内容相同,
     * 凡是不能在ts里面完成的都可以在这里完成 
     * 最终会被合并到一个实例中。
     */
    components: {
        componentsA,
        componentsB
    },
})

export default class MyComponent extends Vue {
    // data
    name: string = "jim";
    age: number = 12;
    bankList: object[] = [];
    showFlag: boolean = false;
    imgSrc: object = {
        bank102,
        bank103,
        bank104
    };
    certTypeList: { key: string; value: string }[] = [
        { key: "0", value: "身份证" },
        { key: "1", value: "户口簿" },
        { key: "2", value: "护照" }
    ];
    
    // methods
    getBankList(){
        
    }
    mounted(){
        // TODO  
    }
}

(3)@Prop 由标签属性注入,获取对应标签属性值,可配置具体prop内容

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

@Component
export default class YourComponent extends Vue {
  @Prop(Number) readonly propA: number | undefined
  @Prop({ default: 'default value' }) readonly propB!: string
  @Prop([String, Boolean]) readonly propC: string | boolean | undefined
}

 相当于

export default {
  props: {
    propA: {
      type: Number
    },
    propB: {
      default: 'default value'
    },
    propC: {
      type: [String, Boolean]
    }
  }
}

(4)@Provide 向任意层级的子组件提供可访问的属性

(5)@Inject 获取父级由Provide提供的属性

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

const symbol = Symbol('baz')

@Component
export class MyComponent extends Vue {
  @Inject() readonly foo!: string
  @Inject('bar') readonly bar!: string
  @Inject({ from: 'optional', default: 'default' }) readonly optional!: string
  @Inject(symbol) readonly baz!: string

  @Provide() foo = 'foo'
  @Provide('bar') baz = 'bar'
}

相当于

const symbol = Symbol('baz')

export const MyComponent = Vue.extend({
  inject: {
    foo: 'foo',
    bar: 'bar',
    optional: { from: 'optional', default: 'default' },
    [symbol]: symbol
  },
  data() {
    return {
      foo: 'foo',
      baz: 'bar'
    }
  },
  provide() {
    return {
      foo: this.foo,
      bar: this.baz
    }
  }
})

(6)@Watch 观察某个属性更新

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

@Component
export default class YourComponent extends Vue {
  @Watch('child')
  onChildChanged(val: string, oldVal: string) {}

  @Watch('person', { immediate: true, deep: true })
  onPersonChanged1(val: Person, oldVal: Person) {}

  @Watch('person')
  onPersonChanged2(val: Person, oldVal: Person) {}
}

相当于

export default {
  watch: {
    child: [
      {
        handler: 'onChildChanged',
        immediate: false,
        deep: false
      }
    ],
    person: [
      {
        handler: 'onPersonChanged1',
        immediate: true,
        deep: true
      },
      {
        handler: 'onPersonChanged2',
        immediate: false,
        deep: false
      }
    ]
  },
  methods: {
    onChildChanged(val, oldVal) {},
    onPersonChanged1(val, oldVal) {},
    onPersonChanged2(val, oldVal) {}
  }
}

(7)@Model 是v-model的装饰器,当自定义组件想使用v-model时,可以使用这种方式,配合emit可以双向传递属性值

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

@Component
export default class YourComponent extends Vue {
  @Model('change', { type: Boolean }) readonly checked!: boolean
}

相当于

export default {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: {
      type: Boolean
    }
  }
}

(8)@Emit this.$emit 的装饰器,如果没有指定名称,默认使用函数名称。有返回值时,使用返回值,没有不使用

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

@Component
export default class YourComponent extends Vue {
  count = 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(e) {
      this.$emit('on-input-change', e.target.value, e)
    },
    promise() {
      const promise = new Promise(resolve => {
        setTimeout(() => {
          resolve(20)
        }, 0)
      })

      promise.then(value => {
        this.$emit('promise', value)
      })
    }
  }
}

9Mixins

// AMixin.ts
@Component
export default class AMixin extends Vue { 
   protected myname = "A";
   created(){}
   getMyName(){ console.log(this.myname) }
}

 

// BMixin.ts
@Component
export default class BMixin extends Vue { 
   protected myname = "B";
   created(){}
   getMyName(){ console.log(this.myname) }
}

页面中使用

@Component
class MyComponent extends Mixins(AMixin,BMixin) { 
   mounted(){
       this.getMyName() // B
   }
}

10computed 对于计算属性computed ,可以用get代替

import { Vue, Component } from "vue-property-decorator";

@Component
class MyComponent extends Vue { 
   private myname = "jim";
   get msg(){
       return "您好!" + this.myname
   }
}

相当于

export default{
  data() {
    return{
        myname: "jim"
    }
  },
  computed:{
      msg(){
          return "您好!" + this.myname;
      }
  }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js 和 TypeScript 是两个非常流行的前端开发工具和编程语言,它们可以很好地结合在一起,为构建大型、可维护的单页面应用(SPA)提供强大的支持。 **Vue.js**: - Vue 是一款轻量级的 JavaScript 框架,以其简单易学、组件化开发和响应式数据绑定而知名。 - 它提供了视图层(View)、模板语法、指令(Directives)和响应式系统,使得开发者能够快速构建用户界面。 - Vue 2.x版本引入了Vuex(状态管理)和Vue Router(路由管理),进一步增强了应用的组织和扩展能力。 **TypeScript**: - TypeScript 是由 Microsoft 开发的一种开放源代码的超集 JavaScript,它添加了静态类型检查、接口、类等面向对象的特性,使JavaScript代码更易于维护和扩展。 - 在 Vue 中使用 TypeScript,可以帮助开发者避免类型错误,提高代码质量和可读性,同时 TypeScript 支持强类型定义,方便团队协作。 将 VueTypeScript 结合的优势包括: 1. **类型安全**:TypeScript 提供的类型注解可以在编译期间捕捉潜在的错误,使代码更健壮。 2. **代码提示**:IDE 集成 TypeScript 支持后,开发者可以得到更好的代码提示和自动完成功能。 3. **大型项目管理**:对于大型项目,TypeScript 可以更好地支持模块化、类和接口,提高代码结构的清晰度。 4. **团队协作**:TypeScript 更容易理解和维护,有助于团队成员之间的沟通和协作。 **相关问题--:** 1. 在实际项目中,如何在 Vue 中启用 TypeScript 以及配置步骤是什么? 2. 类型安全如何帮助 Vue 项目的调试和维护? 3. Vue 的组件和 TypeScript 类有什么相似之处?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值