VueでTypeScriptを使用する方法

VueでTypeScriptを使用する方法

導入

近年、TypeScript を求める声がますます高まり、TypeScript はフロントエンドに必須のスキルとなっています。 TypeScript は JS 型のスーパーセットであり、ジェネリック、型、名前空間、列挙などの機能をサポートし、大規模なアプリケーション開発における JS の欠点を補います。

TypeScript を単独で学習する場合、多くの概念は比較的簡単に理解できると感じるでしょうが、いくつかのフレームワークと組み合わせて使用​​する場合は、依然として多くの落とし穴があります。たとえば、React や Vue などのフレームワークを使用する場合、TypeScript との組み合わせは大きな障害になります。フレームワークが提供する .d.ts 宣言ファイル内のいくつかの複雑な型の定義や、コンポーネントの記述方法などを確認し、大幅な調整を行う必要があります。

この記事では主に私の経験を組み合わせて、 Vuejsからtsにスムーズに移行する方法を説明します。この記事では TypeScript の基本的な知識についてはあまり詳しく説明しないため、この記事を読む際には TypeScript についてある程度理解しておくことをお勧めします。 (詳細は公式ドキュメントhttps://www.w3cschool.cn/typescript/typescript-tutorial.htmlを参照してください。公式ドキュメントは最高の入門マニュアルです)

建てる

正式な足場を通して設置する

# 1. Vue CLIがインストールされていない場合は、まずインストールします。npm install --global @vue/cli

最新のVue CLIツールを使用すると、開発者は TypeScript 統合を使用して新しいプロジェクトを作成できます。

vue create my-app実行するだけです。

次に、コマンド ラインでプリセットを選択するように求められます。矢印キーを使用して、手動で機能を選択するを選択します。

次に、以下に示すように、TypeScript と Babel のオプションが選択されていることを確認します。

次に、残りの設定を以下のように構成します。

セットアップが完了すると、vue cli は依存関係のインストールとプロジェクトのセットアップを開始します。

ディレクトリ解決

インストールが完了したら、プロジェクトを開くと、ts を統合した後のプロジェクト ディレクトリ構造は次のようになります。

|-- ts-vue
    |-- .browserslistrc # browserslistrc 設定ファイル (Autoprefixer をサポートするために使用)
    |-- .eslintrc.js # eslint 設定 |-- .gitignore
    |-- babel.config.js # babel-loader 設定 |-- package-lock.json
    |-- package.json # package.json の依存関係|-- postcss.config.js # postcss の設定|-- README.md
    |-- tsconfig.json # typescript 設定 |-- vue.config.js # vue-cli 設定 |-- public # 静的リソース (直接コピーされます)
    | |-- favicon.ico # ファビコンアイコン| |-- index.html # HTML テンプレート|-- src
    | |-- App.vue # エントリ ページ| |-- main.ts # コンポーネントの初期化などを読み込むエントリ ファイル| |-- shims-tsx.d.ts
    | |-- shims-vue.d.ts
    | |-- アセット # テーマフォントとその他の静的リソース(webpack によって読み込まれる)
    | |-- components # グローバル コンポーネント| |-- router # ルーティング| |-- store # グローバル vuex ストア
    | |-- style # グローバル スタイル| |-- views # すべてのページ|-- tests # テスト

実は、ざっくり言うと、以前jsでビルドしたプロジェクトディレクトリと大きな違いはありません。主な違いは、 js のサフィックスが ts に変更され、 tsconfig.jsonshims-tsx.d.tsshims-vue.d.tsなどのファイルが増えたことです。これらのファイルは何のためにあるのでしょうか。

  • tsconfig.json : Typescript 設定ファイル。主にコンパイルするファイルを指定し、コンパイル オプションを定義するために使用されます。
  • shims-tsx.d.ts : .tsx で終わるファイルで Vue プロジェクトに jsx コードを記述できるようにします。
  • shims-vue.d.ts : 主に TypeScript で .vue ファイルを識別するために使用されます。Ts は、デフォルトでは vue ファイルのインポートをサポートしていません。

使用

始める前に、VueでTypeScriptを使用するための非常に便利なライブラリをいくつか見てみましょう。

vue-class-component : vue-class-componentはクラスデコレータであり、クラスデコレータです。

vue-property-decorator : vue-property-decorator vue 組織内の vue-class-component の拡張です。

'vue-property-decorator' から { Vue、Component、Inject、Provide、Prop、Model、Watch、Emit、Mixins } をインポートします。

vuex-module-decorators : Typescript で vuex を書くための非常に便利なライブラリ

'vuex-module-decorators' から { Module、VuexModule、Mutation、Action、MutationAction、getModule } をインポートします。

コンポーネント宣言

コンポーネントの作成方法は次のようになります

'vue-property-decorator' から { Component、Prop、Vue、Watch } をインポートします。

@成分
デフォルトのクラスTestをエクスポートし、Vueを拡張します。

}

データオブジェクト

'vue-property-decorator' から { Component、Prop、Vue、Watch } をインポートします。

@成分
デフォルトのクラスTestをエクスポートし、Vueを拡張します。
  プライベート名: 文字列;
}

プロップ宣言

@Prop({ デフォルト: false }) プライベート isCollapse!: boolean;
@Prop({ デフォルト: true }) プライベート isFirstLevel!: boolean;
@Prop({ デフォルト: "" }) プライベート basePath!: 文字列;

!: は必ず存在することを意味します。?: は存在しない可能性があることを意味します。これら2つは文法的には代入アサーションと呼ばれる

@Prop(オプション: (PropOptions | コンストラクター[] | コンストラクター) = {})

  • PropOptionsでは、type、default、required、validatorのオプションを使用できます。
  • Constructor[]は、propのオプションの型を指定します
  • String、Number、Booleanなどのコンストラクタは、propの型を指定します。

方法

jsでは、メソッドはメソッドオブジェクトで宣言する必要があり、次のようになります。

パブリッククリック関数(): void {
  console.log(この名前)
  コンソールログ(このメッセージ)
}

監視プロパティを見る

@Watch("$route", { 即時: true })
プライベート onRouteChange(ルート: ルート) {
  const query = route.query を Dictionary<string> として返します。
  if (クエリ) {
  this.redirect = クエリ.redirect;
  this.otherQuery = this.getOtherQuery(クエリ);
  }
}

@Watch(パス: 文字列、オプション: WatchOptions = {})

オプションには2つのプロパティが含まれます:immediate?:boolean: リスニング開始直後にコールバック関数を呼び出すかどうか / deep?:boolean: 監視対象オブジェクトのプロパティが変更されたときにコールバック関数を呼び出すかどうか

@Watch('arr', { 即時: true, ディープ: true })
onArrChanged(新しい値: 数値[], 古い値: 数値[]) {}

計算された

パブリック get allname() {
  'computed ' + this.name を返します。
}

allnameは計算値、nameは監視値です

ライフサイクル関数

パブリック作成(): void {
  console.log('作成されました');
}

パブリックマウント():void{
  console.log('マウント済み')
}

イベントを発行する

'vue-property-decorator' から { Vue, Component, Emit } をインポートします。
@成分
デフォルトのクラスMyComponentをエクスポートし、Vueを拡張します。
  カウント = 0
  @エミット()
  addToCount(n: 数値) {
      this.count += n
  }
  @Emit('リセット')
  リセットカウント() {
      このカウント = 0
  }
  @エミット()
  戻り値() {
      10を返す
  }
  @エミット()
  入力変更(e) {
      e.target.value を返す
  }
  @エミット()
  約束() {
      新しいPromiseを返します(resolve => {
      タイムアウトを設定する(() => {
          解決する(20)
      }, 0)
      })
  }
}

js ライティングを使用する

エクスポートデフォルト{
  データ() {
      戻る {
      カウント: 0
      }
  },
  メソッド: {
      カウントを追加(n) {
      this.count += n
      this.$emit('add-to-count', n)
      },
      リセットカウント() {
      このカウント = 0
      this.$emit('リセット')
      },
      戻り値() {
      this.$emit('戻り値', 10)
      },
      入力変更(e) {
      this.$emit('on-input-change', e.target.value, e)
      },
      約束() {
      const promise = 新しい Promise(resolve => {
          タイムアウトを設定する(() => {
          解決する(20)
          }, 0)
      })
      promise.then(値 => {
          this.$emit('promise', 値)
      })
      }
  }
 }
  • @Emit(イベント?: 文字列)
  • @Emit デコレータはオプションのパラメータを受け入れます。これは $Emit の最初の引数であり、イベント名として機能します。このパラメータが指定されていない場合、$Emit はコールバック関数名をキャメルケースからケバブケースに変換し、それをイベント名として使用します。
  • @Emit は、コールバック関数の戻り値を 2 番目のパラメータとして受け取ります。戻り値が Promise オブジェクトの場合、Promise オブジェクトが解決済みとしてマークされた後に $emit がトリガーされます。
  • @Emitのコールバック関数のパラメータは戻り値の後ろに配置され、$emitによってパラメータとして使用されます。

ヴュークス

ストア デコレータを使用する前に、従来のストアの使用方法を確認しましょう。

エクスポートデフォルト{
    名前空間:true、
    州:{
        :""
    },
    ゲッター:{
        getFoo(state) { state.foo を返す}
    },
    突然変異:
        setFooSync(状態、ペイロード){
            state.foo = ペイロード
        }
    },
    アクション:{
        setFoo({コミット},ペイロード){
            commot("getFoo",ペイロード)
        }
    }
}

次にvuex-module-decoratorsを使い始めます

輸入 {
  Vuexモジュール、
  突然変異、
  アクション、
  モジュールを取得、
  モジュール
} から "vuex-module-decorators" へ;

基本的なプロパティのVuexModule

デフォルトクラス TestModule をエクスポートし、VuexModule を拡張します { }

VuexModuleは、名前空間、状態、ゲッター、モジュール、ミューテーション、アクション、コンテキストなどの基本的なプロパティを提供します。

@Module現在のモジュールをマークします

@Module({ dynamic: true, store, name: "settings" })
クラス Settings は VuexModule を拡張し、ISettingsState を実装します {

}

モジュール自体には、いくつかの構成可能なプロパティがあります。

  • namespaced:boolean サブモジュールを有効/無効にする
  • stateFactory:boolean 状態ファクトリ
  • dynamic:boolean ストアが作成されると、ストアに追加されます。ダイナミックをオンにした後、次のプロパティを指定する必要があります
  • name: 文字列はモジュール名を指定します
  • store: Vuex.Storeエンティティは初期ストアを提供します

@Mutationはmutationとして注釈が付けられます

@突然変異
プライベートSET_NAME(名前: 文字列) {
// ユーザー名を設定します this.name = name;
}

@Actionアクションとして注釈が付けられます

@アクション
パブリック非同期ログイン(userInfo: { ユーザー名: 文字列; パスワード: 文字列 }) {
  // ログインインターフェースとトークンの取得
  { ユーザー名、パスワード } = userInfo とします。
  ユーザー名 = ユーザー名.trim();
  const { data } = ログインを待機します({ ユーザー名、パスワード });
  setToken(data.accessToken);
  this.SET_TOKEN(data.accessToken);
}

getModule型安全なストアを取得します。モジュールは名前属性を提供する必要があります。

エクスポート const UserModule = getModule(User);

Vue で TypeScript を使用する方法についての記事はこれで終わりです。Vue で TypeScript を使用する方法についての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • TypeScript 列挙の基本と例
  • TypeScript の条件型に関する詳細な読書と実践記録
  • Typescript+React でモバイルと PC でシンプルなドラッグ アンド ドロップ効果を実現
  • WebpackはTypeScriptコードをパッケージ化するためのスキャフォールディングを構築します
  • ReactプロジェクトでのTypeScriptの実装
  • Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録
  • Vue3 + TypeScript 開発の概要
  • Vue3+TypeScriptは再帰メニューコンポーネントの完全な例を実装します
  • TypeScriptのインデックスシグネチャの理解に関する簡単な説明

<<:  Windows での MySQL 8.X インストール チュートリアル

>>:  Linux または Android でファイル システムを追加する属性インターフェイスを解析する方法

推薦する

Docker ベースの ELK ログ システムを構築する方法

背景要件:ビジネスがどんどん大きくなると、サーバーの数も増え、さまざまなアクセスログ、アプリケーショ...

Mysql5.6.36 スクリプトのコンパイル、インストール、初期化のチュートリアル

概要この記事は、centos7.3 上で mysql5.3.6 を自動的にコンパイルしてインストール...

SQL Server データベース エラー 5123 の解決方法

なぜなら、SQL Server 2005 に基づくデータベース チュートリアルがあり、そこで使用され...

Webフロントエンド開発CSS関連チームコラボレーション

フロントエンド開発部門は成長し、スタッフも増加し、技術も向上しています。 CSSer はフロントエン...

HTMLで境界線を設定する3つの方法の詳細な説明

HTML で境界線を設定する 3 つの方法 境界線の幅: 1px 2px 2px; 境界線のスタイル...

バントリストコンポーネントをスクロールしても、スクロールバーの位置は保持されます。

バントリストコンポーネントをスクロールするときに、スクロールバーの位置が保持されます。これは、kee...

MySQL接続クエリにおけるととwhereの違いの簡単な分析

1. テーブルを作成する テーブル「学生」を作成( `id` int(11) NULLではない、 `...

星のきらめき効果を実現するネイティブ js

この記事の例では、星のきらめき効果を実現するためのjsの具体的なコードを共有しています。具体的な内容...

複数レベルの複雑な動的ヘッダーの avue-crud 実装例

目次序文バックグラウンドデータの結合フロントエンドデータ表示ページ効果表示Avue.js は、既存の...

Linux で pyenv をインストールする方法

前提条件gitをインストールする必要があるインストール手順1. リモートリポジトリからpyenvをク...

ウェブページのカラーマッチングにおけるオーバーラップとソフトカラーマッチングの手法を詳しく説明

この記事には、細かい点は一切なく、カラーマッチングのテクニックをシェアするだけです。とてもシンプルで...

Reactは無限ループスクロール情報を実装する

この記事では、無限ループスクロールを実現するためのReactの具体的なコードを参考までに紹介します。...

MySQL LOAD_FILE() 関数メソッドの概要

MySQL では、LOAD_FILE() 関数はファイルを読み取り、その内容を文字列として返します。...

上部の固定ナビゲーションバーによって CSS アンカーの配置がブロックされる問題の解決方法

多くのウェブサイトでは、ユーザーが簡単に検索したり他のページに移動したりできるように、上部にナビゲー...

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明以下は私が作成した M...