最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Vue項(xiàng)目中使用Typescript的實(shí)現(xiàn)

 更新時(shí)間:2019年12月19日 08:37:45   作者:BBQ只有番薯  
這篇文章主要介紹了在Vue項(xiàng)目中使用Typescript的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

3.0遲遲沒(méi)有發(fā)布release版本,現(xiàn)階段在Vue項(xiàng)目中使用Typescript需要花不小的精力在工程的配置上面。主要的工作是webpack對(duì)TS,TSX的處理,以及2.x版本下面使用class的形式書(shū)寫(xiě)Vue 組件的一些限制和注意事項(xiàng)。

Webpack 配置

配置webpack對(duì)TS,TSX的支持,以便于我們?cè)赩ue項(xiàng)目中使用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內(nèi)容將會(huì)使用ts-loader處理,而TSX內(nèi)容將會(huì)按照ts-loader-->babel-loader的順序處理。

appendTsSuffixTo/appendTsxSuffixTo 配置項(xiàng)的意思是說(shuō),從vue文件里面分離的script的ts,tsx(取決于<script lang="xxx"></script>)內(nèi)容將會(huì)被加上ts或者tsx的后綴,然后交由ts-loader解析。

我在翻看了ts-loader上關(guān)于appendTsxSuffixTo的討論發(fā)現(xiàn),ts-loader貌似對(duì)文件后綴名稱有很嚴(yán)格的限定,必須得是ts/tsx后綴,所以得在vue-loader extract <script>中內(nèi)容后,給其加上ts/tsx的后綴名,這樣ts-loader才會(huì)去處理這部分的內(nèi)容。

ts-loader只對(duì)tsx做語(yǔ)法類型檢查,真正的jsx-->render函數(shù)應(yīng)該交由babel處理。

所以我們還需要使用plugin-transform-vue-jsx來(lái)將vue jsx轉(zhuǎn)換為真正的render函數(shù)。

// babel.config.json
{
 "presets": ["env"],
 "plugins": ["transform-vue-jsx"]
}

同時(shí),配置TS對(duì)tsx的處理為preserve,讓其只對(duì)tsx做type類型檢查。

// tsconfig.json
{
 "compilerOptions": {
 "jsx": "preserve",
}

使用vue cli 4.x

高版本的vue cli如4.x已經(jīng)集成了vue + typescript的配置。選擇use Typescript + Use class-style component syntax選項(xiàng)創(chuàng)建工程。

創(chuàng)建后的工程目錄如下:

在src根目錄下,有兩個(gè)shims.xx.d.ts的類型聲明文件。

// shims.vue.d.ts
declare module "*.vue" {
 import Vue from "vue";
 export default Vue;
}
// shims.jsx.d.ts
import Vue, { VNode } from "vue";
declare global {
 namespace JSX {
  // tslint:disable no-empty-interface
  interface Element extends VNode {}
  // tslint:disable no-empty-interface
  interface ElementClass extends Vue {}
  interface IntrinsicElements {
   [elem: string]: any;
  }
 }
}

它們是作什么用的呢?

shims.vue.d.ts給所有.vue文件導(dǎo)出的模塊聲明了類型為Vue,它可以幫助IDE判斷.vue文件的類型。

shims.jsx.d.ts 為 JSX 語(yǔ)法的全局命名空間,這是因?yàn)榛谥档脑貢?huì)簡(jiǎn)單的在它所在的作用域里按標(biāo)識(shí)符查找。當(dāng)在 tsconfig 內(nèi)開(kāi)啟了 jsx 語(yǔ)法支持后,其會(huì)自動(dòng)識(shí)別對(duì)應(yīng)的 .tsx 結(jié)尾的文件,(也就是Vue 單文件組件中<script lang="tsx"></script>的部分)可參考

官網(wǎng) tsx

基本用法

在vue 2.x中使用class的方式書(shū)寫(xiě)vue組件需要依靠vue-property-decorator來(lái)對(duì)vue class做轉(zhuǎn)換。

<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
export default class extends Vue {
 @Prop({ default: 'default msg'}) private msg!: string;
 name!: string;
 show() {
  console.log("this.name", this.name);
 }
}
</script>

導(dǎo)出的class是經(jīng)過(guò)Vue.extend之后的VueComponent函數(shù)(理論上class就是一個(gè)Function)。

其最后的結(jié)果就像我們使用Vue.extend來(lái)擴(kuò)展一個(gè)Vue組件一樣。

// 創(chuàng)建構(gòu)造器
var Profile = Vue.extend({
 template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
 data: function () {
  return {
   firstName: 'Walter',
   lastName: 'White',
   alias: 'Heisenberg'
  }
 }
})

export default {
  components: {
    Profile 
  }
}

注意上面的Profile組件并不是和我們平時(shí)一樣寫(xiě)的Vue組件是一個(gè)plain object配置對(duì)象,它其實(shí)是一個(gè)VueComponent函數(shù)。

父組件實(shí)例化子組件的時(shí)候,會(huì)對(duì)傳入的vue object 進(jìn)行擴(kuò)展,使用Vux.extend轉(zhuǎn)換為組件函數(shù)。
如果components中的值本身是一個(gè)函數(shù),就會(huì)省略這一步。這一點(diǎn), 從Vue 源碼中可以看出。

if (isObject(Ctor)) {
  Ctor = baseCtor.extend(Ctor)
 }

上面的Ctor就是在components中傳入的組件,對(duì)應(yīng)于上面導(dǎo)出的Profile組件。

使用vuex

使用vuex-class中的裝飾器來(lái)對(duì)類的屬性做注解。

import Vue from 'vue'import Component from 'vue-class-component'import {
 State,
 Getter,
 Action,
 Mutation,
 namespace
} from 'vuex-class'

const someModule = namespace('path/to/module')

@Component
export class MyComp extends Vue {
 @State('foo') stateFoo
 @State(state => state.bar) stateBar
 @Getter('foo') getterFoo
 @Action('foo') actionFoo
 @Mutation('foo') mutationFoo
 @someModule.Getter('foo') moduleGetterFoo

 // If the argument is omitted, use the property name
 // for each state/getter/action/mutation type
 @State foo
 @Getter bar
 @Action baz
 @Mutation qux

 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

對(duì)于mixin,我們使用class的繼承很容易實(shí)現(xiàn)類似功能。

import Vue from 'vue'
import { Component } from 'vue-property-decorator'
@Component
class DeployMixin extends Vue{
 name: string;
 deploy(){
  // do something
 }
}
@Component
class Index extends DeployMixin{
 constructor(){ 
  super()
 }
 sure(){
  this.deploy()
 }
}

VS code jsx快捷鍵

設(shè)置 VS code中對(duì)emmet的支持

"emmet.includeLanguages": {
  "javascript": "html"
}

或者是

"emmet.includeLanguages": {
  "javascript": "javascriptreact"
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于vue cli重構(gòu)多頁(yè)面腳手架過(guò)程詳解

    基于vue cli重構(gòu)多頁(yè)面腳手架過(guò)程詳解

    本文分步驟給大家介紹了基于vue cli重構(gòu)多頁(yè)面腳手架過(guò)程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2018-01-01
  • vue3配置Element及element-plus/lib/theme-chalk/index.css報(bào)錯(cuò)的解決

    vue3配置Element及element-plus/lib/theme-chalk/index.css報(bào)錯(cuò)的解決

    這篇文章主要介紹了vue3配置Element及element-plus/lib/theme-chalk/index.css報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue如何根據(jù)不同的環(huán)境使用不同的接口地址

    vue如何根據(jù)不同的環(huán)境使用不同的接口地址

    這篇文章主要介紹了vue如何根據(jù)不同的環(huán)境使用不同的接口地址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue.js中vue-property-decorator的使用方法詳解

    Vue.js中vue-property-decorator的使用方法詳解

    vue-property-decorator是一個(gè)用于在Vue.js中使用TypeScript裝飾器的庫(kù),它能夠簡(jiǎn)化 Vue 組件的定義,使代碼更加簡(jiǎn)潔和可維護(hù),它能夠簡(jiǎn)化Vue組件的定義,使代碼更加簡(jiǎn)潔和可維護(hù),本文將深入探討vue-property-decorator的使用方法,并展示如何在Vue.js項(xiàng)目中應(yīng)用它
    2024-08-08
  • vue生成隨機(jī)驗(yàn)證碼的示例代碼

    vue生成隨機(jī)驗(yàn)證碼的示例代碼

    本篇文章主要介紹了vue生成隨機(jī)驗(yàn)證碼的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧‘
    2017-09-09
  • vue中router-view組件的使用詳解

    vue中router-view組件的使用詳解

    這篇文章主要介紹了vue中router-view組件的使用,這個(gè)時(shí)候我們就需要用到路由中的 router-view組件(也叫路由占位符)了,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • Vite引入虛擬文件的實(shí)現(xiàn)

    Vite引入虛擬文件的實(shí)現(xiàn)

    本文主要介紹了Vite引入虛擬文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Vue 自定義指令詳解

    Vue 自定義指令詳解

    本文介紹了如何在Vue中定義和使用自定義指令,包括指令的注冊(cè)、鉤子函數(shù)、參數(shù)以及常見(jiàn)指令的封裝,如v-copy、v-longpress等,自定義指令在處理某些底層DOM操作時(shí)非常便捷,感興趣的朋友一起看看吧
    2025-01-01
  • 關(guān)于VueRouter導(dǎo)入的全過(guò)程

    關(guān)于VueRouter導(dǎo)入的全過(guò)程

    這篇文章主要介紹了關(guān)于VueRouter導(dǎo)入的全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue項(xiàng)目中input輸入框輸入不了值問(wèn)題及解決

    vue項(xiàng)目中input輸入框輸入不了值問(wèn)題及解決

    這篇文章主要介紹了vue項(xiàng)目中input輸入框輸入不了值問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論

游戏| 长顺县| 铜川市| 岑巩县| 绍兴市| 通河县| 金湖县| 汤原县| 上栗县| 崇礼县| 阿克苏市| 荃湾区| 平果县| 旌德县| 承德县| 工布江达县| 阳西县| 安图县| 万盛区| 唐山市| 德兴市| 青神县| 秦皇岛市| 日照市| 嘉义县| 建湖县| 合肥市| 济阳县| 台前县| 桐梓县| 睢宁县| 海宁市| 金门县| 栾川县| 嘉黎县| 瓮安县| 秭归县| 株洲市| 弋阳县| 响水县| 汉中市|