TypeScript是一个js的超级,提供了类型系统和es6的支持,它是由微软开发,第一个版本发布于2012年10月,经屡次更新,现已成为前端社区中不可忽视的力量,而且已经在微软内部普遍应用,google的angular2也使用了TypeScript的开发语言,这也就是咱们为何学习ts的背景。html
咱们经常使用的vue框架也支持了使用typeScript开发,今天咱们就来学习一下如何使用vue-cli3+typeScript开发一个简单项目,最近在研究腾讯的ai接口,完成一个简单的demo,话很少少,上代码前端
一、安装vue-cli3,检查版本,建立项目,已经全局安装过vue-cli3的直接建立项目便可,跟以前同样vue
npm install -g @vue/cli vue --version vue create my-ts-ai
二、须要注意的是第一次使用ts的,能够选择Manually select feature
来自由选择功能,经常使用的有vuex、vue-router、CSS Pre-processors等,咱们必定要把typescript勾上,就能够回车进入下一步了。PS:勾选的操做是按空格键。
须要注意,选择格式化检查的,须要选择TSlint,不然写ts会标红报错;node
三、建立成功以后,执行启动命令:npm run serve;启动以后就能够访问本地项目、用ts编写代码了ios
这是一个涵盖了vue的一些对象的集合,咱们能够从这里取一些东西出来es6
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
取出来的这几个属性,分别是 组件定义Component
,父组件传递过来的参数Prop
,原始vue对象Vue
,数据监听对象Watch
。还包括这里没有列举出来的Model
,Emit
,Inject
,Provide
,能够本身尝试下。
咱们看一下经常使用的属性prop、watch通常写法
prop;@Prop() private msg!: string;
watch:算法
// watch @Watch('active') private chageActive(newVal: string, oldVal: string) { console.log(`change txt: ${oldVal} to ${newVal}`); } @Watch('sticker') private chageSticker(newVal: string, oldVal: string) { console.log(`change txt: ${oldVal} to ${newVal}`); }
data:vue-router
// data private num: number = 0; private appId: number = 2140682408; private appKay: string = '3gP0QJTqC3j8qP6M'; private imgBase64: string = ''; private effectImg: string = '';
methods:vuex
private choose(id: number, index: number) { this.sticker = id; this.active = index; } private postData(url: string, params: object) { const self: IParams = this; axios.post(url, qs.stringify(params), { headers: {'Content-Type': 'application/x-www-form-urlencoded'}, }).then( (response) => { console.log(response.data); if (response.data.ret === 0) { self.effectImg = 'data:image/jpeg;base64,' + response.data.data.image; } }).catch((error) => { console.log(error); }); }
computed:vue-cli
// computed get getMsg() { return this.msg + '11111'; } get testTxt() { return this.$store.state.testTxt; }
在store里写法基本不变只要遵循ts的规则便可;
主要是说一下使用的时候的注意事项,话很少说直接上代码
引如
// 使用vuex import { State, Getter, Action, Mutation, namespace, } from 'vuex-class'; const userModule = namespace('user')
声明
@State('testNum') public testNum!: any; @Action('UPDATA_CHANGE_LOGIN') public UPDATA_CHANGE_LOGIN!: Function; @Mutation('CHANGE_LOGIN') public CHANGE_LOGIN!: Function; @userModule.State('firstName') public firstName!: string; @userModule.State('lastName') public lastName!: string; @userModule.Mutation('UPDATE_FIRST_NAME') public UPDATE_FIRST_NAME!: Function
而后像之前那样使用便可;
以上是我写的使用typeScript、vue-cli3框架编写的demo的重点;
下面主要说一下前端使用腾讯ai接口作一些效果;
关于注册、建立应用这些能够本身在网站尝试
前端是没有权限直接调用接口鉴权的,由于有跨域问题,通常须要后台配合,因此如下这些代码可使用nodejs开发;
由于是在vue框架下作的开发,vue帮助咱们作了服务器代理,因此咱们能够在本地配置代理服务器,看下效果,同时了解基本的步骤,后续使用nodejs作接口鉴权;话很少少上代码
主要是签名算法,遵循腾讯的签名算法规则 详见https://ai.qq.com/doc/auth.shtml
签名算法步骤
private postPurikura() { // 调用大头贴的接口,参数详见腾讯开放平台apihttps://ai.qq.com/doc/facesticker.shtml const params: IParams = { app_id: this.appId, time_stamp: parseInt((new Date().getTime() / 1000).toString(), 10), nonce_str: Math.random().toString().substr(3, 8) + Date.now().toString(36), image: this.imgBase64, sticker: this.sticker, }; const sign = this.getSign(params, this.appKay); // 签名算法,遵循腾讯的签名算法规则 详见https://ai.qq.com/doc/auth.shtml params.sign = sign; this.postData(apis.facesticker, params); } private getSign(params: any, appkey: string) { const sortArr = Object.keys(params).sort((x: string, y: string): number => { return x.localeCompare(y, 'zh-Hans-CN', { sensitivity: 'accent' }); }); const newParams: IParams = {}; sortArr.forEach((ele: string) => { newParams[ele] = params[ele]; });// 请求参数对按key进行**字典升序**排序 console.log(newParams); let url: string = ''; Object.keys(newParams).forEach((key: string, i) => { if (newParams[key] !== '') { url += key + '=' + encodeURIComponent(newParams[key]) + '&'; } }); url += 'app_key=' + appkey; // 列表N中的参数对按**URL键值对的格式**拼接成字符串,并将应用密钥以app\_key为键名,组成URL键值拼接到字符串T末尾,获得**字符串S**(如:key1=value1&key2=value2&app\_key=密钥) const md5url = md5(url); // 对字符串S进行MD5运算 const sign = md5url.toUpperCase(); // 的**MD5值全部字符转换成大写**,获得接口**请求签名** console.log(sign); return sign; }
一、对象要建立接口;直接定义类型为object,必须是已经肯定的属性和值,若是新加属性,则会标红提示没有这个属性值;建立接口的方式以下
interface IParams { [x: string]: any } // 使用的时候,就能够给reader随意增长属性 `const reader: IParams = new FileReader();`
二、parseInt
要传2个参数,否则会报Missing radix parameter,这个意思是缺乏一个基数根parseInt(string, radix)
函数的,这个函数一共须要两个参数:
三、控制台报错 Calls to 'console.log' are not allowed.不被容许写入console,要在tslint.json中的rules中加入 "no-console": false。方便测试
四、注意和js作区分,一句代码结束要加;,对象的最后一个属性要加,
五、若是VSCode编辑器有警告提示,好比: Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option to remove this warning.
能够把工做区其余的项目移除,或者把本项目拖动到工做区的首位,或者在把本项目的tsconfig.json复制到工做区首位的项目的根目录下,重启编辑器,有比较大的几率能够解决警告提示。