在Vue项目中使用Typescript的实现
3.0迟迟没有发布release版本,现阶段在Vue项目中使用Typescript需要花不小的精力在工程的配置上面。主要的工作是webpack对TS,TSX的处理,以及2.x版本下面使用class的形式书写Vue组件的一些限制和注意事项。
Webpack配置
配置webpack对TS,TSX的支持,以便于我们在Vue项目中使用Typescript和tsx。
module.exports={ entry:'./index.vue', output:{filename:'bundle.js'}, resolve:{ extensions:['.ts','.tsx','.vue','.vuex'] }, module:{ rules:[ {test:/\.vue$/,loader:'vue-loader', options:{ loaders:{ ts:'ts-loader', tsx:'babel-loader!ts-loader', } } }, { test:/\.ts$/, loader:'ts-loader', options:{appendTsSuffixTo:[/TS\.vue$/]}}, { test:/\.tsx$/, loader:'babel-loader!ts-loader', options:{ appendTsxSuffixTo:[/TSX\.vue$/] } } ] } }
在上面的配置中,vue文件中的TS内容将会使用ts-loader处理,而TSX内容将会按照ts-loader-->babel-loader的顺序处理。
appendTsSuffixTo/appendTsxSuffixTo配置项的意思是说,从vue文件里面分离的script的ts,tsx(取决于
我在翻看了ts-loader上关于appendTsxSuffixTo的讨论发现,ts-loader貌似对文件后缀名称有很严格的限定,必须得是ts/tsx后缀,所以得在vue-loaderextract的部分)可参考
官网tsx
基本用法
在vue2.x中使用class的方式书写vue组件需要依靠vue-property-decorator来对vueclass做转换。
import{Component,Prop,Vue}from"vue-property-decorator"; exportdefaultclassextendsVue{ @Prop({default:'defaultmsg'})privatemsg!:string; name!:string; show(){ console.log("this.name",this.name); } }
导出的class是经过Vue.extend之后的VueComponent函数(理论上class就是一个Function)。
其最后的结果就像我们使用Vue.extend来扩展一个Vue组件一样。
//创建构造器 varProfile=Vue.extend({ template:'{{firstName}}{{lastName}}aka{{alias}}
', data:function(){ return{ firstName:'Walter', lastName:'White', alias:'Heisenberg' } } }) exportdefault{ components:{ Profile } }
注意上面的Profile组件并不是和我们平时一样写的Vue组件是一个plainobject配置对象,它其实是一个VueComponent函数。
父组件实例化子组件的时候,会对传入的vueobject进行扩展,使用Vux.extend转换为组件函数。
如果components中的值本身是一个函数,就会省略这一步。这一点,从Vue源码中可以看出。
if(isObject(Ctor)){ Ctor=baseCtor.extend(Ctor) }
上面的Ctor就是在components中传入的组件,对应于上面导出的Profile组件。
使用vuex
使用vuex-class中的装饰器来对类的属性做注解。
importVuefrom'vue'importComponentfrom'vue-class-component'import{ State, Getter, Action, Mutation, namespace }from'vuex-class' constsomeModule=namespace('path/to/module') @Component exportclassMyCompextendsVue{ @State('foo')stateFoo @State(state=>state.bar)stateBar @Getter('foo')getterFoo @Action('foo')actionFoo @Mutation('foo')mutationFoo @someModule.Getter('foo')moduleGetterFoo //Iftheargumentisomitted,usethepropertyname //foreachstate/getter/action/mutationtype @Statefoo @Getterbar @Actionbaz @Mutationqux created(){ this.stateFoo//->store.state.foo this.stateBar//->store.state.bar this.getterFoo//->store.getters.foo this.actionFoo({value:true})//->store.dispatch('foo',{value:true}) this.mutationFoo({value:true})//->store.commit('foo',{value:true}) this.moduleGetterFoo//->store.getters['path/to/module/foo'] } }
mixin
对于mixin,我们使用class的继承很容易实现类似功能。
importVuefrom'vue' import{Component}from'vue-property-decorator' @Component classDeployMixinextendsVue{ name:string; deploy(){ //dosomething } } @Component classIndexextendsDeployMixin{ constructor(){ super() } sure(){ this.deploy() } }
VScodejsx快捷键
设置VScode中对emmet的支持
"emmet.includeLanguages":{ "javascript":"html" }
或者是
"emmet.includeLanguages":{ "javascript":"javascriptreact" }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。