项目背景:
一个以前的项目( 刚入职实习的时候写的,用的vuecli2 ),然后这次要添加修改东西,看着代码看的头大,冲动之下就重构了( 想打死自己,写的啥玩意 ),刚好用下最近刚学的typescript,从搭建开始,一步步更新记录下,怕自己之后忘了再回过头来看看。( 顺便说一句,用起来有点别扭,不过还是挺爽的,期待vue3.0... )
一.项目搭建:
使用命令 vue create news 创建项目
配置自定义,贴一下我自定义的安装依赖
ts+vuex+router这几个肯定是要的,这里的css我选择的是scss,unit测试也来一个
之后一些的选项就自己选择
3. 搭建好后目录就是这样
├── public // 静态页面 ├── src // 主目录 ├── assets // 静态资源 ├── components // 组件 ├── views // 页面 ├── App.vue // 页面主入口 ├── main.ts // 脚本主入口 ├── router.ts // 路由 ├── shims-tsx.d.ts // 相关 tsx 模块注入 ├── shims-vue.d.ts // Vue 模块注入 └── store.ts // vuex 配置 ├── tests // 测试用例 ├── .eslintrc.js // eslint 相关配置 ├── .gitignore // git 忽略文件配置 ├── babel.config.js // babel 配置 ├── postcss.config.js // postcss 配置 ├── package.json // 依赖 └── tsconfig.json // ts 配置
想着为了以后更好的维护,就修改了一下目录结构
├── public // 静态页面 ├── src // 主目录 ├── api // 接口 ├── assets // 静态资源 ├── filters // 过滤 ├── store // vuex 配置 ├── styles // 样式 ├── utils // 工具方法(axios封装,全局方法等) ├── views // 页面 ├── App.vue // 页面主入口 ├── main.ts // 脚本主入口 ├── router.ts // 路由 ├── shime-global.d.ts // 相关 全局或者插件 模块注入 ├── shims-tsx.d.ts // 相关 tsx 模块注入 ├── shims-vue.d.ts // Vue 模块注入, 使 TypeScript 支持 *.vue 后缀的文件 ├── tests // 测试用例 ├── .eslintrc.js // eslint 相关配置 ├── postcss.config.js // postcss 配置 ├── .gitignore // git 忽略文件配置 ├── babel.config.js // preset 记录 ├── package.json // 依赖 ├── README.md // 项目 readme ├── tsconfig.json // ts 配置 └── vue.config.js // webpack 配置
tsconfig.js是ts的配置项
具体可以看官网自己配置: https://www.tslang.cn/docs/handbook/compiler-options.html
4.初步修改vue.config.js
const path = require("path"); const webpack = require('webpack'); function resolve(dir) { return path.join(__dirname, dir) } const router='http://xxx.xxx.xxx' module.exports = { publicPath: "./", //基本路径 outputDir: 'dist', //打包时生成的文件夹 lintOnSave: process.env.NODE_ENV === 'development', productionSourceMap: process.env.NODE_ENV === 'development', devServer: { port: 8080, open: true, proxy: { '/test': { target: router, changeOrigin: true } } }, configureWebpack: { name: process.env.VUE_APP_NAME, resolve: { alias: { '@': resolve('src'), } }, externals: {}, plugins: [], }, }
至此,项目初步搭建完成,然后就开始封装安装插件
二. 安装插件和基本内容填充
这里我使用 的element-ui,echarts, babel-polyfill,jquery等
这里有个注意的,在typescript 中使用jquery,echarts等插件的 时候,必须要安装对应的声明文件,当然typescripe社区已经有很多大佬写好了,前人种树,后人乘凉复制代码
什么是声明文件:
https://github.com/xcatliu/typescript-tutorial/blob/master/basics/declaration-files.md
声明文件搜索地址: microsoft.github.io/TypeSearch/
untils 文件夹(可以放一些常用的工具函数,节流、防抖、localStorage等)
这个里面我存放了一些工具函数,date函数,axios的封装等
styles 文件夹 (存放全局scss文件)
这里面除了初始化一些样式外,我还定义了一些常亮,例如导航栏的高度,颜色等,便于 好改
router 文件夹(懒加载)
因为这个系统权限之类的并没有很复杂,路由也不是很多,就没有按模块引入,就直接写了。
/* webpackChunkName: "login" */ /*这里名字是什么,打包出来的名字就是什么*/ { path: '/', name: 'login', component: () => import(/* webpackChunkName: "login" */ '@/views/login/index.vue'), meta: { title:'登录页' keepAlive: false, } }, { path: "/home", name: "home", redirect: "/homepage", component: () => import(/* webpackChunkName: "home" */"@/views/Home.vue"), children: [ { path: "/homepage", component: () => import(/* webpackChunkName: "homepage" */ "@/views/homepage/index.vue"), name: "homepage", meta: { title: "首页", keepAlive: true } }, ] }
api 文件夹
根据不同模块的接口,去建不同的文件
三.vue中typescript的写法
typescript的写法和vue差不多,只是script的区别,例:
import { Component, Prop, Vue, Watch } from 'vue-property-decorator' @Component({ name: 'homepage', components: {} }) export class MyComponent extends Vue { @Prop({ default: '' }) private name!: string @Watch('name', { deep: true }) changeName(newVal,olVal){} //data private count:number=5 private arr:string[]=[] mounted(){} //methods private test(){} }
四.typescript使用中的问题
1.获取refs
写法:
let layoutList:any = this.$refs.layout as HTMLDivElement
2.引用插件,且找不到声明文件或引用Json文件
在shims-vue.d.ts 文件中声明,再在组件中引用
declare module "*.json" { const value: any; export default value; } declare module "vue-count-to" { const count: any; export default count; }
页面里面
import * as myJson from '../../../public/test.json'
使用 myJson.default
3.计算属性
get age() { return this.aTagDatasF.filter(item => item.visible) }
4.@prop
@Prop()private datas!: any
感叹号是非null和非undefined的类型断言,所以上面的写法就是对datas这个属性进行非空断言
5.引入vue组件时,后面必须加 .vue
6.定义接口类型,前面加 I,例如,接口尽量定义类型,规范管理
interface IUserInfo{ name:string, index:number }
7.定义全局变量(可以用vuex取代)
在.ts文件里面
export var User:IUserInfo={ name:'111', index:996 }
其他页面import ,然后 就可以获取到这个值
8.强行让ts不检测
//@ts-ignore 下一行不检测
五.开始改造页面代码(开始吐槽自己)
槽点1:组件切换
以前的代码(部分片段)
改造后:用component 用is去动态判断就行
<div class="haveClick> <component :is="echartsIndex" :obj="obj"/> </div>
槽点2:对象赋值
以前的代码(部分片段):
改造后:
//这样写是因为initObj还有别的key for(let i in this.obj){ if(this.initObj(i)!=undefined){ this.initObj[i]=this.obj[i] } } //或者 写一个函数,如果key值一样就赋值
槽点3:switch case 判断之前的代码:
//片段,有十几个case optionList:['饼图','柱状图','折线图','...'] 筛选下拉后,aa为index switch (aa) { case 0: this.getData() break; case 1: this.avgBqzs() break; case 2: this.areaCount() break; case 3: this.yiqing() break; case 4: this.avgFinish() break; }
修改后:
private optionList=[{ title:'饼图', type:'getData' },{ title:'柱状图', type:'avgBqzs'} ...... ] 下拉后,用change事件获取 item (这里就不获取index了) 例如: changeSelect(item:any){ //当然这里不能通过ts的编译 @ts-ignore this[item.type]()}
六.个人项目规范
1.尽量不要使用for,使代码观赏性更高
forEach 遍历 , map转换,filter 过滤
2.调接口使用 尽量 async和await来调用接口
例如:
private async getData() { const { data } = await getTransactions({}) }
3.只需要部分筛选条件的时候用解构去获取值
public sizeTop={ id:'', City:'', County:'', time:'' } const {City,County}=this.sizeTop private async getData() { const { data } = await getTransactions({City,County}) }
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】