91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Typescript怎么在Vue項目中使用

發布時間:2021-03-22 17:29:31 來源:億速云 閱讀:293 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關Typescript怎么在Vue項目中使用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

Webpack 配置

配置webpack對TS,TSX的支持,以便于我們在Vue項目中使用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內容將會使用ts-loader處理,而TSX內容將會按照ts-loader-->babel-loader的順序處理。

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

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

ts-loader只對tsx做語法類型檢查,真正的jsx-->render函數應該交由babel處理。

所以我們還需要使用plugin-transform-vue-jsx來將vue jsx轉換為真正的render函數。

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

同時,配置TS對tsx的處理為preserve,讓其只對tsx做type類型檢查。

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

使用vue cli 4.x

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

創建后的工程目錄如下:

Typescript怎么在Vue項目中使用

在src根目錄下,有兩個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文件導出的模塊聲明了類型為Vue,它可以幫助IDE判斷.vue文件的類型。

shims.jsx.d.ts 為 JSX 語法的全局命名空間,這是因為基于值的元素會簡單的在它所在的作用域里按標識符查找。當在 tsconfig 內開啟了 jsx 語法支持后,其會自動識別對應的 .tsx 結尾的文件,(也就是Vue 單文件組件中<script lang="tsx"></script>的部分)可參考

官網 tsx

基本用法

在vue 2.x中使用class的方式書寫vue組件需要依靠vue-property-decorator來對vue class做轉換。

<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>

導出的class是經過Vue.extend之后的VueComponent函數(理論上class就是一個Function)。

其最后的結果就像我們使用Vue.extend來擴展一個Vue組件一樣。

// 創建構造器
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組件并不是和我們平時一樣寫的Vue組件是一個plain object配置對象,它其實是一個VueComponent函數。

父組件實例化子組件的時候,會對傳入的vue object 進行擴展,使用Vux.extend轉換為組件函數。
如果components中的值本身是一個函數,就會省略這一步。這一點, 從Vue 源碼中可以看出。

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

上面的Ctor就是在components中傳入的組件,對應于上面導出的Profile組件。

使用vuex

使用vuex-class中的裝飾器來對類的屬性做注解。

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

對于mixin,我們使用class的繼承很容易實現類似功能。

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快捷鍵

設置 VS code中對emmet的支持

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

或者是

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

關于Typescript怎么在Vue項目中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

濮阳县| 揭阳市| 西和县| 榆中县| 龙门县| 丰原市| 武威市| 富源县| 即墨市| 滦平县| 凉山| 枝江市| 海城市| 托克逊县| 澄城县| 铜鼓县| 日土县| 同江市| 阳江市| 金阳县| 全椒县| 谷城县| 阳新县| 皮山县| 承德市| 启东市| 伊春市| 义乌市| 汝阳县| 梓潼县| 赤水市| 黔西县| 临清市| 临朐县| 东明县| 枣强县| 两当县| 乐业县| 乌拉特中旗| 祁东县| 绥化市|