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 でファイル システムを追加する属性インターフェイスを解析する方法

推薦する

MySQL 8.0.20 Window10無料インストール版設定とNavicat管理チュートリアルグラフィック詳細説明

1. MySQL 8.0.20をダウンロードして解凍するダウンロードリンク: https://dev...

background-positionプロパティでのパーセンテージ値の使用法の検討

背景位置が背景画像の表示に与える影響この2日間のプロジェクトでホームページの写真を入れ替えていたとこ...

Linux SSHポートを転送する3つの方法

ssh は私が最も頻繁に使用する 2 つのコマンドライン ツールのうちの 1 つです (もう 1 つ...

開発者がデータベースロックを詳細に理解する必要がある理由

1.ロックしますか? 1.1 ロックとは何ですか?ロックの本当の意味は、鍵またはコードで開くことがで...

MySQL の count 関数の正しい使い方の詳細な説明

1. 説明MySQLでは、テーブル内の行の総数を取得する必要がある場合、通常は次の文を使用します。 ...

Linux CentOS 7.4 で mysql5.7.20 のパスワードを変更する方法

MySQL がバージョン 5.7 にアップグレードされた後、セキュリティが大幅に向上しました。しかし...

MySQL で最大接続数を正しく変更する 3 つの方法

MySQL データベースをインストールすると、デフォルトの MySQL データベースの最大接続数が ...

HTML テーブルタグチュートリアル (44): テーブルヘッダータグ

<br />ソース コード内で表の構造を明確に区別するために、HTML 言語では、表のヘ...

Tomcat8はcronologを使用してCatalina.Outログを分割します

背景tomcat によって生成された catalina.out ログ ファイルが分割されていない場合...

純粋な CSS カスタム複数行省略記号の問題 (原理から実装まで)

テキストオーバーフローを表示するにはどうすればいいですか? どのようなニーズがありますか?単一行です...

Vueはプルダウンを実装してさらに読み込む

Element-UI に慣れた開発者なら、無限スクロールの InfiniteScroll が使いにく...

間違った MySQL コマンドをキャンセルしたい場合はどうすればいいですか?

間違った mysql コマンドを入力したのでキャンセルしたいです。どうすればいいですか? ctrl ...

html+css3で実装されたログインインターフェース

成果を達成するまずHTMLを使って基本的なフレームワークを構築します <本文> <...

Vue+express+Socketでチャット機能を実現

この記事では、チャット機能を実現するためのVue+express+Socketの具体的なコードを参考...

Spring Boot 2.4 の新機能、ワンクリックビルド、Docker イメージプロセスの詳細説明

背景開発プロセス中に Docker コンテナ化をサポートするために、通常は Maven を使用してコ...