一篇文章帶你使用Typescript封裝一個(gè)Vue組件(簡(jiǎn)單易懂)
一、搭建項(xiàng)目以及初始化配置
vue create ts_vue_btn
這里使用了vue CLI3自定義選擇的服務(wù),我選擇了ts、stylus等工具。然后創(chuàng)建完項(xiàng)目之后,進(jìn)入項(xiàng)目。使用快捷命令code .進(jìn)入Vs code編輯器(如果沒(méi)有code .,需要將編輯器的bin文件目錄地址放到環(huán)境變量的path中)。然后,我進(jìn)入編輯器之后,進(jìn)入設(shè)置工作區(qū),隨便設(shè)置一個(gè)參數(shù),這里比如推薦設(shè)置字號(hào),點(diǎn)下。這里是為了生成.vscode文件夾,里面有個(gè)json文件。

我們?cè)陂_(kāi)發(fā)項(xiàng)目的時(shí)候,項(xiàng)目文件夾內(nèi)的文件很多,會(huì)有時(shí)影響視覺(jué)。那么這個(gè)文件就是設(shè)置什么文件隱藏,注意只是隱藏,而不是刪除!下面是我自己寫(xiě)的,在Vue cli3生成的項(xiàng)目需要隱藏的文件參數(shù)。
{
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/README.md": true,
"**/node_modules":true,
"**/shims-tsx.d.ts": true,
"**/shims-vue.d.ts": true,
"**/.browserslistrc": true,
".eslintrc.js": true,
"babel.config.js": true,
"package-lock.json": true,
".gitignore": true,
"tsconfig.json": true
}
}
以下就是所看到的文件目錄,我把一些無(wú)關(guān)緊要的文件跟文件夾隱藏或者刪除后所看到的。

文件解讀(從上往下):
| 文件夾或文件 | 包含子文件夾或文件 | 含義 |
|---|---|---|
| .vscode | settings.json | 隱藏文件設(shè)置 |
| public | index.html、favicon.ico | 靜態(tài)文件存放處 |
| src | components文件夾(存放組件)、App.vue、Home.vue、main.js | 項(xiàng)目主要文件夾 |
| package.json | 無(wú) | 項(xiàng)目依賴參數(shù)等 |
二、開(kāi)發(fā)實(shí)踐
下圖為所需要?jiǎng)?chuàng)建的項(xiàng)目文件目錄,這里我們開(kāi)發(fā)一個(gè)Vue按鈕組件。

如下圖所示,這就是我們要用Typescript開(kāi)發(fā)的組件。

開(kāi)始編輯:
1、App.vue
<template>
<div id="app">
<Home></Home>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';// 編寫(xiě)類樣式組件所需要的一些類或者是裝飾器
import Home from "@/Home.vue"; // 引入頁(yè)面組件
// 這里我們需要使用Component裝飾器,這個(gè)裝飾器是注冊(cè)組件用的,里面的參數(shù)是一個(gè)對(duì)象,內(nèi)有一個(gè)components屬性,值為引入的組件名
@Component({
components:{
Home
}
})
export default class App extends Vue {}
</script>
<style lang="stylus">
</style>
2、UIBtn.vue
<template>
<!-- v-on="$listeners" 可以使用,在本類不再監(jiān)聽(tīng),在其他地方監(jiān)聽(tīng),可以不用$emit(),但是我們這里不用它 -->
<button
class="ui-btn"
@click="onBtnclick('success!')"
:class="{
'ui-btn-xsmall':xsmall,
'ui-btn-small':small,
'ui-btn-large':large,
'ui-btn-xlarge':xlarge
}"
>
<slot>Button</slot>
</button>
</template>
<script lang="ts">
import { Component, Vue, Emit, Prop } from "vue-property-decorator"; // 編寫(xiě)類樣式組件所需要的一些類或者是裝飾器
@Component
export default class UIBtn extends Vue {
@Prop(Boolean) private xsmall: boolean | undefined;
@Prop(Boolean) private small: boolean | undefined;
@Prop(Boolean) private large: boolean | undefined;
@Prop(Boolean) private xlarge: boolean | undefined;
// eslint-disable-next-line @typescript-eslint/no-empty-function
@Emit("click") private emitclick(x: string) {}
private mounted() {
console.log(this.large);
}
private onBtnclick(x: string) {
this.emitclick(x);
}
}
</script>
<style scoped lang="stylus" >
resize(a, b, c)
padding a b
font-size c
.ui-btn
resize(12px, 20px, 14px)
border 0 solid #000
border-radius 4px
outline none
font-weight 500;
letter-spacing 0.09em
background-color #409eff
color #fff
cursor pointer
user-select none
&:hover
filter brightness(120%)
&:active
filter brightness(80%)
&.ui-btn-xsmall
resize(5px, 15px, 14px)
&.ui-btn-small
resize(8px, 18px, 14px)
&.ui-btn-large
resize(14px, 22px, 14px)
&.ui-btn-xlarge
resize(16px, 24px, 14px)
</style>
3、Home.vue
<template>
<div class="home-con">
<div class="btn-group">
<UIBtn class="btn" @click="resize('xsmall')">超小</UIBtn>
<UIBtn class="btn" @click="resize('small')">小</UIBtn>
<UIBtn class="btn" @click="resize('normal')">正常</UIBtn>
<UIBtn class="btn" @click="resize('large')">大</UIBtn>
<UIBtn class="btn" @click="resize('xlarge')">超大</UIBtn>
</div>
<div class="btn-con">
<UIBtn @click='onClick'
:xlarge="xlarge"
:large="large"
:small="small"
:xsmall="xsmall"
>主要按鈕</UIBtn>
</div>
<div class="btn-pro">
<UIBtn large >樣式按鈕</UIBtn>
</div>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'; // 編寫(xiě)類樣式組件所需要的一些類或者是裝飾器
import UIBtn from '@/components/UIBtn.vue';
@Component({
components:{
UIBtn
}
})
export default class Home extends Vue {
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
private xlarge: boolean = false;
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
private large: boolean = false;
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
private xsmall: boolean = false;
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
private small: boolean = false;
private resize (name: string){
console.log(name)
switch (name) {
case 'xsmall':
this.xsmall=true;
this.small=false;
this.large=false;
this.xlarge=false;
break;
case 'small':
this.xsmall=false;
this.small=true;
this.large=false;
this.xlarge=false;
break;
case 'normal':
this.xsmall=false;
this.small=false;
this.large=false;
this.xlarge=false;
break;
case 'large':
this.xsmall=false;
this.small=false;
this.large=true;
this.xlarge=false;
break;
case 'xlarge':
this.xsmall=false;
this.small=false;
this.large=false;
this.xlarge=true;
break;
}
}
private onClick(x: string) {
console.log(x)
}
}
</script>
<style lang="stylus" scoped>
.btn-group
margin 50px 0
.btn
margin 6px
.btn-pro
margin-top 50px
</style>
到此這篇關(guān)于一篇文章帶你使用Typescript封裝一個(gè)Vue組件的文章就介紹到這了,更多相關(guān)Typescript封裝Vue組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3+TS項(xiàng)目中eslint、prettier安裝配置詳細(xì)指南
為了更好的統(tǒng)一項(xiàng)目的代碼風(fēng)格,因此在編寫(xiě)時(shí)就可以使用eslint+prettier,它們不僅能方便代碼編寫(xiě),還能避免不必要的錯(cuò)誤,讓代碼變得更加嚴(yán)謹(jǐn),這篇文章主要給大家介紹了關(guān)于Vue3+TS項(xiàng)目中eslint、prettier安裝配置的相關(guān)資料,需要的朋友可以參考下2024-07-07
解決Electron?store的commit和dispatch不好用問(wèn)題
這篇文章主要介紹了解決Electron?store的commit和dispatch不好用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
element表格el-table實(shí)現(xiàn)虛擬滾動(dòng)解決卡頓問(wèn)題
當(dāng)頁(yè)面數(shù)據(jù)過(guò)多,前端渲染大量的DOM時(shí),會(huì)造成頁(yè)面卡死問(wèn)題,本文主要介紹了element表格el-table實(shí)現(xiàn)虛擬滾動(dòng)解決卡頓問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Vue表單數(shù)據(jù)修改與刪除功能實(shí)現(xiàn)
本文通過(guò)實(shí)例代碼介紹了Vue表單數(shù)據(jù)修改與刪除功能實(shí)現(xiàn),結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友跟隨小編一起看看吧2023-10-10
解決vue 路由變化頁(yè)面數(shù)據(jù)不刷新的問(wèn)題
下面小編就為大家分享一篇解決vue 路由變化頁(yè)面數(shù)據(jù)不刷新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
vue編寫(xiě)的功能強(qiáng)大的swagger-ui頁(yè)面及使用方式
swagger是一種標(biāo)準(zhǔn)的數(shù)據(jù)格式的定義,對(duì)于不同語(yǔ)言進(jìn)行實(shí)現(xiàn)一些注解API式的東西,能快速生成這種描述restful格式的api信息的json串,本文給大家詳細(xì)介紹vue編寫(xiě)的功能強(qiáng)大的swagger-ui頁(yè)面,感興趣的朋友跟隨小編一起看看吧2022-02-02
vue.extend實(shí)現(xiàn)alert模態(tài)框彈窗組件
這篇文章主要為大家詳細(xì)介紹了vue.extend實(shí)現(xiàn)alert模態(tài)框彈窗組件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04

