您好,登錄后才能下訂單哦!
這篇文章主要講解了如何實(shí)現(xiàn)ts+vuecli4重構(gòu)項(xiàng)目,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
項(xiàng)目背景:
一個(gè)以前的項(xiàng)目( 剛?cè)肼殞?shí)習(xí)的時(shí)候?qū)懙模玫膙uecli2 ),然后這次要添加修改東西,看著代碼看的頭大,沖動(dòng)之下就重構(gòu)了( 想打死自己,寫的啥玩意 ),剛好用下最近剛學(xué)的typescript,從搭建開(kāi)始,一步步更新記錄下,怕自己之后忘了再回過(guò)頭來(lái)看看。( 順便說(shuō)一句,用起來(lái)有點(diǎn)別扭,不過(guò)還是挺爽的,期待vue3.0... )
一.項(xiàng)目搭建:
使用命令 vue create news 創(chuàng)建項(xiàng)目
配置自定義,貼一下我自定義的安裝依賴
ts+vuex+router這幾個(gè)肯定是要的,這里的css我選擇的是scss,unit測(cè)試也來(lái)一個(gè)
之后一些的選項(xiàng)就自己選擇
3. 搭建好后目錄就是這樣
├── public // 靜態(tài)頁(yè)面 ├── src // 主目錄 ├── assets // 靜態(tài)資源 ├── components // 組件 ├── views // 頁(yè)面 ├── App.vue // 頁(yè)面主入口 ├── main.ts // 腳本主入口 ├── router.ts // 路由 ├── shims-tsx.d.ts // 相關(guān) tsx 模塊注入 ├── shims-vue.d.ts // Vue 模塊注入 └── store.ts // vuex 配置 ├── tests // 測(cè)試用例 ├── .eslintrc.js // eslint 相關(guān)配置 ├── .gitignore // git 忽略文件配置 ├── babel.config.js // babel 配置 ├── postcss.config.js // postcss 配置 ├── package.json // 依賴 └── tsconfig.json // ts 配置
想著為了以后更好的維護(hù),就修改了一下目錄結(jié)構(gòu)
├── public // 靜態(tài)頁(yè)面 ├── src // 主目錄 ├── api // 接口 ├── assets // 靜態(tài)資源 ├── filters // 過(guò)濾 ├── store // vuex 配置 ├── styles // 樣式 ├── utils // 工具方法(axios封裝,全局方法等) ├── views // 頁(yè)面 ├── App.vue // 頁(yè)面主入口 ├── main.ts // 腳本主入口 ├── router.ts // 路由 ├── shime-global.d.ts // 相關(guān) 全局或者插件 模塊注入 ├── shims-tsx.d.ts // 相關(guān) tsx 模塊注入 ├── shims-vue.d.ts // Vue 模塊注入, 使 TypeScript 支持 *.vue 后綴的文件 ├── tests // 測(cè)試用例 ├── .eslintrc.js // eslint 相關(guān)配置 ├── postcss.config.js // postcss 配置 ├── .gitignore // git 忽略文件配置 ├── babel.config.js // preset 記錄 ├── package.json // 依賴 ├── README.md // 項(xiàng)目 readme ├── tsconfig.json // ts 配置 └── vue.config.js // webpack 配置
tsconfig.js是ts的配置項(xiàng)
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', //打包時(shí)生成的文件夾 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: [], }, }
至此,項(xiàng)目初步搭建完成,然后就開(kāi)始封裝安裝插件
二. 安裝插件和基本內(nèi)容填充
這里我使用 的element-ui,echarts, babel-polyfill,jquery等
這里有個(gè)注意的,在typescript 中使用jquery,echarts等插件的 時(shí)候,必須要安裝對(duì)應(yīng)的聲明文件,當(dāng)然typescripe社區(qū)已經(jīng)有很多大佬寫好了,前人種樹(shù),后人乘涼復(fù)制代碼
什么是聲明文件:
https://github.com/xcatliu/typescript-tutorial/blob/master/basics/declaration-files.md
聲明文件搜索地址: microsoft.github.io/TypeSearch/
untils 文件夾(可以放一些常用的工具函數(shù),節(jié)流、防抖、localStorage等)
這個(gè)里面我存放了一些工具函數(shù),date函數(shù),axios的封裝等
styles 文件夾 (存放全局scss文件)
這里面除了初始化一些樣式外,我還定義了一些常亮,例如導(dǎo)航欄的高度,顏色等,便于 好改
router 文件夾(懶加載)
因?yàn)檫@個(gè)系統(tǒng)權(quán)限之類的并沒(méi)有很復(fù)雜,路由也不是很多,就沒(méi)有按模塊引入,就直接寫了。
/* webpackChunkName: "login" */ /*這里名字是什么,打包出來(lái)的名字就是什么*/ { path: '/', name: 'login', component: () => import(/* webpackChunkName: "login" */ '@/views/login/index.vue'), meta: { title:'登錄頁(yè)' 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: "首頁(yè)", keepAlive: true } }, ] }
api 文件夾
根據(jù)不同模塊的接口,去建不同的文件
三.vue中typescript的寫法
typescript的寫法和vue差不多,只是script的區(qū)別,例:
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使用中的問(wèn)題
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; }
頁(yè)面里面
import * as myJson from '../../../public/test.json'
使用 myJson.default
3.計(jì)算屬性
get age() { return this.aTagDatasF.filter(item => item.visible) }
4.@prop
@Prop()private datas!: any
感嘆號(hào)是非null和非undefined的類型斷言,所以上面的寫法就是對(duì)datas這個(gè)屬性進(jìn)行非空斷言
5.引入vue組件時(shí),后面必須加 .vue
6.定義接口類型,前面加 I,例如,接口盡量定義類型,規(guī)范管理
interface IUserInfo{ name:string, index:number }
7.定義全局變量(可以用vuex取代)
在.ts文件里面
export var User:IUserInfo={ name:'111', index:996 }
其他頁(yè)面import ,然后 就可以獲取到這個(gè)值
8.強(qiáng)行讓ts不檢測(cè)
//@ts-ignore 下一行不檢測(cè)
五.開(kāi)始改造頁(yè)面代碼(開(kāi)始吐槽自己)
槽點(diǎn)1:組件切換
以前的代碼(部分片段)
改造后:用component 用is去動(dòng)態(tài)判斷就行
<div class="haveClick> <component :is="echartsIndex" :obj="obj"/> </div>
槽點(diǎn)2:對(duì)象賦值
以前的代碼(部分片段):
改造后:
//這樣寫是因?yàn)閕nitObj還有別的key for(let i in this.obj){ if(this.initObj(i)!=undefined){ this.initObj[i]=this.obj[i] } } //或者 寫一個(gè)函數(shù),如果key值一樣就賦值
槽點(diǎn)3:switch case 判斷之前的代碼:
//片段,有十幾個(gè)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){ //當(dāng)然這里不能通過(guò)ts的編譯 @ts-ignore this[item.type]()}
六.個(gè)人項(xiàng)目規(guī)范
1.盡量不要使用for,使代碼觀賞性更高
forEach 遍歷 , map轉(zhuǎn)換,filter 過(guò)濾
2.調(diào)接口使用 盡量 async和await來(lái)調(diào)用接口
例如:
private async getData() { const { data } = await getTransactions({}) }
3.只需要部分篩選條件的時(shí)候用解構(gòu)去獲取值
public sizeTop={ id:'', City:'', County:'', time:'' } const {City,County}=this.sizeTop private async getData() { const { data } = await getTransactions({City,County}) }
看完上述內(nèi)容,是不是對(duì)如何實(shí)現(xiàn)ts+vuecli4重構(gòu)項(xiàng)目有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。