Vue 3 および Vue 2 でのコーディング、パフォーマンスの最適化、エコシステムの改善に関する包括的なガイド

概要: Vue.js は人気のある JavaScript フレームワークであり、その最新バージョンである Vue 3 は、多くの点で以前のバージョンである Vue 2 とは異なります。このブログでは、Vue 2 と矛盾する Vue 3 のコーディング方法に焦点を当てます。Vue 3 で導入された新機能、構文の変更、最適化について説明します。これらの変更を詳細に比較することで、Vue 3 をより適切に移行して使用する方法がわかります。

1. はじめに

Vue 3 では、Composition API が Options API の補足および拡張機能として導入されました。構成 API は、コードを編成するためのより柔軟で構成可能な方法を提供するように設計されています。構成 API とオプション API の間の不一致については、以下で詳しく説明します。

1. 構成API

Comboposition API は Vue 3 の新機能です。これは、コード ロジックを整理して再利用するための一連の機能 API を提供します。Options API と比較して、Composition API はより柔軟で保守しやすく、複雑なビジネス ロジックやコンポーネント間の共有ロジックの処理に特に適しています。

Comboposition API の主な機能は次のとおりです。

  • 関数を使用してロジックを整理する: 関連するロジックを関数に従ってカプセル化し、関数を通じて再利用します。
  • ロジックの正確な組み合わせ: 固定された宣言順序に従わずに、さまざまな関数のロジックを必要に応じて組み合わせることができます。
  • コードの再利用性の向上: ロジックをカスタム関数に抽出し、コンポーネント内で参照したり呼び出すことができます。
  • 型推論とエディターのサポートの向上: 関数型プログラミングのおかげで、エディターは型をより適切に推論し、コード補完を行うことができます。

以下は、Composition API を使用した例です。

import {
    
     reactive, computed } from 'vue';

export default {
    
    
  setup() {
    
    
    const state = reactive({
    
    
      count: 0,
    });

    const increment = () => {
    
    
      state.count++;
    };

    const doubledCount = computed(() => {
    
    
      return state.count * 2;
    });

    return {
    
    
      state,
      increment,
      doubledCount,
    };
  },
};

2. オプション API

オプション API は、Vue 2 でコンポーネントを記述するためによく使用される方法です。オプション オブジェクトを宣言することで、コンポーネントのさまざまなプロパティ、メソッド、ライフサイクル フックを定義します。コンポジション API と比較して、オプション API は、単純なコンポーネントの作成や初心者向けに適しています。

オプション API の主な機能は次のとおりです。

  • オプション オブジェクトに基づく: さまざまなオプションを含むオブジェクトを使用して、コンポーネントのさまざまな側面を定義します。
  • 宣言型ライフサイクルフック: 事前定義されたライフサイクルフック関数を通じてコン​​ポーネントのライフサイクルイベントを処理します。
  • データとメソッドは同じオブジェクトで定義されます。コンポーネントのデータとメソッドは、オプション オブジェクトのプロパティで定義されます。
  • オブジェクト内のコンテキスト アクセス: コンポーネントのコンテキストには、 this キーワードを使用してコンポーネント内でアクセスできます。

次に、オプション API を使用した例を示します。

export default {
    
    
  data() {
    
    
    return {
    
    
      count: 0,
    };
  },
  methods: {
    
    
    increment() {
    
    
      this.count++;
    },
  },
  computed: {
    
    
    doubledCount() {
    
    
      return this.count * 2;
    },
  },
};

概要:
構成 API は、オプション API の補足として Vue 3 に導入されました。Comboposition API は、複雑なビジネス ロジックやコンポーネント間の共有ロジックの処理に適した、より柔軟で構成可能なコード記述方法を提供します。およびオプション API

単純なコンポーネントを作成する場合や初心者に適しています。移行プロジェクトまたは新しいプロジェクトでは、ニーズに応じて適切な API を選択して Vue コンポーネントを作成できます。

2. テンプレートの構文

Vue 3 には、テンプレート構文の点で Vue 2 といくつかの不一致もあります。以下では、v-model ディレクティブ、テンプレート内の属性バインディング、および動的コンポーネントの変更をそれぞれ紹介します。

1. v-model ディレクティブ:

Vue 2 では、v-model ディレクティブを使用して、フォーム要素とコンポーネント間の双方向バインディングを実装します。Vue 3 では、v-model ディレクティブの動作が変更されました。Vue 3 の v-model ディレクティブは、主にコンポーネントのプロップとエミット間の双方向バインディングに使用されます。

v-model ディレクティブを使用する場合は、コンポーネントの props で modelValue 属性を定義し、emit イベントで update:modelValue を使用して属性を更新する必要があります。具体的な使い方は以下の通りです。

<template>
  <custom-input v-model="value"></custom-input>
</template>

<script>
import CustomInput from './CustomInput.vue';

export default {
  components: {
    CustomInput,
  },
  data() {
    return {
      value: '',
    };
  },
};
</script>

CustomInput コンポーネントでは、props を通じて modelValue を受け取り、入力ボックスの入力イベントで $emit('update:modelValue', newValue) を使用して親コンポーネントの値を更新する必要があります。

2. テンプレート内の属性バインディング:

Vue 2 では、v-bind ディレクティブまたは省略されたコロン構文を使用してプロパティ バインディングを実現できます。Vue 3 では、コロン構文の書き方が少し異なり、プロパティを明示的にバインドするには v-bind ディレクティブを使用する必要があります。

Vue 2 のプロパティ バインディングの例:

<template>
  <div :class="{ active: isActive }"></div>
  <input :value="message">
</template>

Vue 3 のプロパティ バインディングの例:

<template>
  <div v-bind:class="{ active: isActive }"></div>
  <input v-bind:value="message">
</template>

Vue 3 では、属性バインディングの省略形、つまり v-bind を接頭辞記号 (@、:、# など) として省略し、次に従って適切な接頭辞記号を選択することもできることに注意してください。特定の目的。

3. 動的コンポーネント:

Vue 2 では、要素と属性を使用して動的なコンポーネントの切り替えを実現できます。Vue 3 では、動的コンポーネントの記述方法がいくつか変更されました。

Vue 2 の動的コンポーネントの例:

<template>
  <component :is="currentComponent"></component>
</template>

<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';

export default {
  data() {
    return {
      currentComponent: 'ComponentA',
    };
  },
  components: {
    ComponentA,
    ComponentB,
  },
};
</script>

Vue 3 の動的コンポーネントの例:

<template>
  <component :is="currentComponent"></component>
</template>

<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';

export default {
  data() {
    return {
      currentComponent: ComponentA,
    };
  },
  components: {
    ComponentA

,
    ComponentB,
  },
};
</script>

Vue 3 では、コンポーネントの名前文字列を使用せずに、コンポーネント オブジェクトを currentComponent の値として直接使用できます。

概要:
Vue 3 では、v-model ディレクティブの使用法が変更され、主にコンポーネントのプロップとエミット間の双方向バインディングに使用されます。テンプレートのプロパティ バインディングには、v-bind ディレクティブを使用した明示的なプロパティ バインディングが必要です。また、構文を簡素化するために、さまざまな接頭辞記号の使用を選択できます。動的コンポーネントの記述方法は Vue 3 でも一貫しています。必要なのは、コンポーネント オブジェクトを is 属性に直接割り当てることだけです。これらの変更により、Vue 3 でのテンプレート構文がより柔軟になり、使いやすくなりました。

3. 応答性の高いシステム

Vue 3 では、リアクティブ システムにも Vue 2 といくつかの不一致があります。以下では、Ref と Reactive、Computed と Watch、および静的プロパティの変更をそれぞれ紹介します。

1. リファレンスとリアクティブ:

Vue 2 では、Vue.observable() メソッドを使用して、通常のオブジェクトをリアクティブ オブジェクトに変換します。Vue 3 では、2 つの新しいリアクティブ API、Ref と Reactive が導入されました。

  • Ref: Ref は、通常のデータをラップしてリアクティブにする Vue 3 の新しい型です。通常のデータは、ref() 関数を通じて Ref オブジェクトにラップできます。Ref オブジェクトを使用する場合は、.value プロパティを通じて値にアクセスし、変更する必要があります。
import {
    
     ref } from 'vue';

const count = ref(0);

console.log(count.value); // 访问值

count.value = 1; // 修改值
  • Reactive: Reactive は、通常のオブジェクトを受け取り、リアクティブ プロキシ オブジェクトを返す Vue 3 の新しい関数です。Reactive 関数を使用する場合、Vue 2 のようにオブジェクトを変換するために Vue.observable() を手動で呼び出す必要はありません。
import {
    
     reactive } from 'vue';

const state = reactive({
    
    
  count: 0,
});

console.log(state.count); // 访问值

state.count = 1; // 修改值

2. 計算して監視:

Vue 3 では、Computed と Watch の使用方法は基本的に Vue 2 と同じですが、いくつかの微妙な変更があります。

  • 計算済み: Vue 3 では、computed() 関数を使用して計算済みプロパティを作成できます。computed() 関数はパラメータとして関数を受け取り、Ref オブジェクトを返します。Vue 3 では、計算されたプロパティを定義するために get および set を使用する必要がなくなり、計算された結果を直接返すことに注意してください。
import {
    
     computed, ref } from 'vue';

const count = ref(0);

const doubledCount = computed(() => count.value * 2);

console.log(doubledCount.value); // 访问计算属性的值
  • Watch: Vue 3 では、watch() 関数を使用して、リアクティブ データが変更されたときにコールバック関数を実行するリスナーを作成できます。watch() 関数は、監視対象のデータとコールバック関数の 2 つのパラメータを受け取ります。Vue 3 では、watch() 関数は文字列式をサポートしなくなったことに注意してください。
import {
    
     watch, ref } from 'vue';

const count = ref(0);

watch(count, (newValue, oldValue) => {
    
    
  console.log(`count changed from ${
      
      oldValue} to ${
      
      newValue}`);
});

3. 静的属性:

Vue 2 では、Vue インスタンスの $options プロパティを通じてコン​​ポーネントの静的プロパティにアクセスできます。Vue 3 では、静的プロパティが削除され、コンポーネント インスタンスを通じて直接アクセスできなくなりました。これは、Vue 3 がプロキシに基づいた新しい内部実装を使用しており、静的プロパティがインスタンスの一部ではなくなっているためです。

概要:
Vue 3 では、Ref と Reactive により、レスポンシブ データを作成するためのより柔軟で直感的な方法が提供されます。Computed と Watch は基本的に同じように使用されます。

ただし、文法の詳細にはいくつかの変更があります。Vue 3 ではコンポーネントの静的プロパティが削除されており、インスタンスを通じて直接アクセスできないことに注意してください。これらの変更により、応答性の高いシステムがより直観的になり、使いやすくなります。

4. 仮想DOM

Vue 3 では、仮想 DOM (Virtual DOM) にも Vue 2 とのいくつかの不一致があります。以下では、仮想 DOM に関連する 3 つの変更点、フラグメント、テレポート、サスペンスを紹介します。

1. 断片:

Vue 2 では、テンプレート内で複数のルート要素を使用することは無効であり、親要素でラップする必要があります。Vue 3 では、Fragment を使用してこの問題を解決できます。Fragment は、テンプレート内の複数の要素をラップするために使用される特別なプレースホルダーですが、レンダリング結果に追加の DOM 要素を生成しません。

フラグメントを使用した例:

<template>
  <Fragment>
    <div>Element 1</div>
    <div>Element 2</div>
  </Fragment>
</template>

フラグメントは短縮構文を使用して<></>表すことができます。

<template>
  <>
    <div>Element 1</div>
    <div>Element 2</div>
  </>
</template>

2.テレポート:

テレポートは Vue 3 の新機能で、DOM 内の任意の場所にコンポーネントのコンテンツをレンダリングするために使用されます。Teleport は、モーダル、ダイアログ、ポップアップ メニューでのコンポーネントのレンダリングなど、コンポーネントの外部でコンテンツをレンダリングする必要性に対処する簡潔な方法を提供します。

テレポートを使用した例:

<template>
  <Teleport to="body">
    <div class="modal">
      Modal Content
    </div>
  </Teleport>
</template>

上の例では、to属性はテレポートをレンダリングするターゲットの場所 ( ここ ) を指定していますbodyが、他の正当な DOM セレクターを指定することもできます。

3. サスペンス:

サスペンスは、Vue 3 で導入されたもう 1 つの機能で、非同期コンポーネントがロードされてレンダリングの準備ができるまで、非同期コンポーネントのロード中にプレースホルダーを表示するために使用されます。サスペンスは、より優れたユーザー エクスペリエンスとより詳細な制御を提供します。

サスペンスを使用した例:

<template>
  <Suspense>
    <template #default>
      <div>Loading...</div>
    </template>
    <template #fallback>
      <div>Error! Failed to load component.</div>
    </template>
    <AsyncComponent />
  </Suspense>
</template>

<script>
import { defineAsyncComponent } from 'vue';

const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'));

export default {
  components: {
    AsyncComponent,
  },
};
</script>

上記の例では、#default非同期コンポーネントがロードされる前にスロット内のコンテンツが表示され、#fallback非同期コンポーネントのロードに失敗したときにスロット内のコンテンツが表示されます。

概要:
Vue 3 では、Fragment は複数のルート要素の問題を解決する方法を提供し、Teleport はより柔軟なコンポーネント レンダリング位置制御を提供し、Suspense はより優れた非同期コンポーネント読み込みエクスペリエンスを提供します。これら

この変更により、Virtual DOM の機能が強化され、より多くの開発オプションとより良いユーザー エクスペリエンスが提供されます。

5. パフォーマンスの最適化

Vue 3 では、パフォーマンスの最適化に関するいくつかの新機能と改善もあります。以下では、パフォーマンスの最適化に関連する 2 つの側面である静的プロモーションとコンパイルの最適化について紹介します。

1.静的巻き上げ:

Vue 2 では、再レンダリングのたびにテンプレート内の静的コンテンツが再作成されるため、パフォーマンスが低下する可能性があります。Vue 3 では、静的プロモーション テクノロジを通じて、コンパイラが静的コンテンツを検出して最適化し、それを静的定数にプロモートすることで、再作成のコストを削減できます。

静的リフティングには次の利点があります。

  • これにより、仮想 DOM の作成と比較の回数が減り、レンダリングのパフォーマンスが向上します。
  • 不必要な DOM 操作を減らすことで、ページのリフローと再描画のコストが削減されます。

2. コンパイルの最適化:

Vue 3 ではコンパイラが改良され、コンパイルの効率とパフォーマンスを向上させるためにいくつかの最適化手段が導入されました。

  • パッチ フラグ: コンパイラは、テンプレートの静的コンテンツと動的コンテンツの違いに基づいて各 VNode ノードにパッチ フラグを追加し、更新プロセス中により正確な操作を実行し、不必要な比較およびレンダリング操作を削減します。

  • イベント処理関数のキャッシュ: Vue 3 では、コンパイラはイベント処理関数をキャッシュして、再レンダリングされるたびに新しい関数インスタンスが作成されることを回避し、イベント処理のパフォーマンスを向上させます。

  • 静的ノードのプロモーション: コンパイラーはテンプレート内の静的ノードを検出し、それらを定数にプロモートして、再レンダリングされるたびに新しい VNode が作成されることを回避し、レンダリングのオーバーヘッドを削減します。

  • ツリー シェイキング: Vue 3 のコンパイラは、テンプレートからの未使用のコンポーネントと命令の削除をサポートしているため、パッケージ化のボリュームが削減され、アプリケーションの読み込みパフォーマンスが向上します。

概要:
Vue 3 では、静的改善やコンパイルの最適化などの手段によってアプリケーションのパフォーマンスを向上させることができます。静的ブースティングは静的コンテンツを再作成するオーバーヘッドを削減し、コンパイルの最適化はコンパイラーを改善し、レンダリング プロセスを最適化することでパフォーマンスを向上させます。これらの最適化措置により、Vue 3 のパフォーマンスが大幅に向上し、より良いユーザー エクスペリエンスとより高い開発効率が実現しました。

6. TypeScript のサポート

Vue 3 では、TypeScript のサポートが大幅に改善されました。以下では、TypeScript サポートに関連する 2 つの側面である型推論と型宣言を紹介します。

1. 型推論:

Vue 3 は多くの場合、変数の型を自動的に推測できるため、型安全性と開発エクスペリエンスが向上します。ここではいくつかの例を示します。

  • Props 推論: コンポーネントでは、defineProps関数を通じてコン​​ポーネントの props を定義し、props のデフォルト値と渡された値に基づいて型推論を実行できます。
import {
    
     defineComponent, defineProps } from 'vue';

const MyComponent = defineComponent({
    
    
  props: {
    
    
    message: String,
    count: {
    
    
      type: Number,
      default: 0,
    },
  },
  setup(props) {
    
    
    // 在使用 props 时,可以获得类型推断
    console.log(props.message.toUpperCase());
    console.log(props.count.toFixed(2));

    // ...
  },
});
  • Ref 推論:ref関数を使用して Ref オブジェクトを作成する場合、Vue 3 は Ref オブジェクトにラップされている値の型を自動的に推論できます。
import {
    
     ref } from 'vue';

const count = ref(0); // 推断为 Ref<number>

console.log(count.value.toFixed(2)); // value 推断为 number
  • 計算された推論:computed関数を使用して計算されたプロパティを作成する場合、Vue 3 は計算された関数の戻り値に基づいて計算されたプロパティの型を自動的に推測できます。
import {
    
     computed, ref } from 'vue';

const count = ref(0);

const doubledCount = computed(() => count.value * 2); // 推断为 ComputedRef<number>

console.log(doubledCount.value.toFixed(2)); // value 推断为 number

2. 型宣言:

Vue 3 では、TypeScript で Vue コンポーネントを使用する場合の、より正確な型推論と型チェックのサポートが強化されています。

  • defineComponentdefineComponent 関数:コンポーネントは、コンポーネント構成オブジェクトを受け入れ、正しい型宣言を含むコンポーネント オプション オブジェクトを返す関数を使用して定義できます。
import {
    
     defineComponent } from 'vue';

export default defineComponent({
    
    
  name: 'MyComponent',
  props: {
    
    
    message: String,
    count: {
    
    
      type: Number,
      default: 0,
    },
  },
  setup(props) {
    
    
    console.log(props.message.toUpperCase());
    console.log(props.count.toFixed(2));

    // ...
  },
});
  • オプション API の型宣言: オプション API を使用するコンポーネントの場合、Vue 3 は正しい型宣言を提供し、コンポーネント オプションを記述するときに正しい型ヒントと型チェックを確実に取得できるようにします。
import {
    
     Options, VueConstructor } from 'vue';

const MyComponent: Options = {
    
    
  name: 'MyComponent',
  props: {
    
    
    message: String,
    count: {
    
    
      type: Number,
      default: 0,
    },
  },
  setup(props) {
    
    
    console.log(props.message.toUpperCase());
    console.log(props.count.toFixed(2));

    // ...
  },
};

export default MyComponent as VueConstructor;

概要:
Vue 3 で TypeScript サポートが改善されました

、型推論と型宣言を含みます。型推論により、開発者はより優れた型安全性と開発エクスペリエンスを得ることができる一方、型宣言により、Vue コンポーネントを使用する際の正確な型ヒントと型チェックが保証されます。これらの改善により、TypeScript を使用した Vue アプリケーションの開発がより快適かつ効率的になりました。

7. スロットとコンポーネント

Vue 3 では、スロットとコンポーネントにもいくつかの変更があります。新しいスロット構文とコンポーネント インスタンス アクセスを以下に紹介します。

1. 新しいスロット構文:

Vue 3 では、より柔軟で直感的な新しいスロット構文が導入されています。新しいスロット構文は<slot>要素を使用してスロットを定義し、名前付きスロットとスコープ付きスロットを通じてさらに多くの機能を有効にします。

名前付きスロットの例:

<template>
  <div>
    <slot name="header"></slot>
    <div>Content</div>
    <slot name="footer"></slot>
  </div>
</template>

<template v-slot:slotName>コンポーネントを使用する場合、または の略語を使用して<template #slotName>スロットの内容を具体的に定義できます。

<template>
  <MyComponent>
    <template #header>
      <h1>Header Content</h1>
    </template>
    <p>Main Content</p>
    <template #footer>
      <footer>Footer Content</footer>
    </template>
  </MyComponent>
</template>

スコープスロットの例:

<template>
  <div>
    <slot name="header" :title="title"></slot>
    <div>Content</div>
    <slot name="footer" :year="year"></slot>
  </div>
</template>

slotPropsスコープ付きスロットを使用する場合、スロットに渡されるデータには、スロット コンテンツ内のプロパティを通じてアクセスできます。

<template>
  <MyComponent>
    <template #header="slotProps">
      <h1>{
   
   { slotProps.title }}</h1>
    </template>
    <p>Main Content</p>
    <template #footer="slotProps">
      <footer>{
   
   { slotProps.year }}</footer>
    </template>
  </MyComponent>
</template>

2. コンポーネント インスタンスへのアクセス:

Vue 2 では、$refsを通じてコン​​ポーネント インスタンスにアクセスできますが、Vue 3 では、コンポーネント インスタンスへのアクセスが変更されました。関数を使用してrefリアクティブ参照を作成し、それをコンポーネントにバインドできます。

<template>
  <div>
    <MyComponent ref="myComponentRef"></MyComponent>
    <button @click="logComponentData">Log Component Data</button>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const myComponentRef = ref(null);

    const logComponentData = () => {
      console.log(myComponentRef.value.data);
    };

    return {
      myComponentRef,
      logComponentData,
    };
  },
};
</script>

上記の例では、ref関数を介して参照が作成され、コンポーネントmyComponentRefにバインドされています。MyComponentその後、myComponentRef.value経由でコンポーネント インスタンスにアクセスし、そのデータを取得できます。

概要:
Vue 3 では、スロット構文が変更されました

新しいスロット構文を導入し、スロットの使用をより柔軟かつ直観的にしました。同時に、コンポーネント インスタンスへのアクセスも変更され、ref関数を通じてリアクティブ参照を作成し、コンポーネントにバインドしてコンポーネント インスタンスにアクセスできるようになりました。これらの変更により、スロットとコンポーネントの使用がより便利かつ強力になりました。

8. トランジションとアニメーション

Vue 3 ではトランジションとアニメーションにもいくつかの改善が加えられています。以下に、Transition コンポーネントとアニメーション クラス名の 2 つの側面を紹介します。

1. 遷移コンポーネント:

Vue 3 では、トランジション コンポーネントを通じてトランジション効果を実現できます。Transition コンポーネントは、要素の挿入または削除時にトランジション効果を適用する機能を提供します。

Transition コンポーネントを使用する場合、次のプロパティを通じてトランジション効果を制御できます。

  • name: トランジション効果の名前を指定します。CSS クラス名を設定することで、特定のトランジション効果を定義できます。

  • appear: 初期レンダリング時にトランジション効果を適用するかどうかを指定します。

  • enter-class// enter-active-class:enter-to-class要素挿入時の遷移クラス名を指定します。

  • leave-class// leave-active-class:leave-to-class要素を削除する際の遷移クラス名を指定します。

以下は、Transition コンポーネントを使用してグラデーショントランジションを実装する例です。

<template>
  <Transition name="fade">
    <div v-if="show" class="box"></div>
  </Transition>
  <button @click="toggle">Toggle</button>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const show = ref(true);

    const toggle = () => {
      show.value = !show.value;
    };

    return {
      show,
      toggle,
    };
  },
};
</script>

<style>
.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.5s;
}

.fade-enter,
.fade-leave-to {
  opacity: 0;
}
</style>

上記の例では、name="fade"設定によりラップされた要素に Transition コンポーネントが適用され、トランジション効果の CSS クラス名が定義されています。最初のレンダリング中に、fade-enterと のfade-enter-activeクラス名が適用されて、グラデーションの外観効果が実現されます。要素が削除されると、クラス名が適用されて、グラデーションの消失効果が実現されますfade-leavefade-leave-active

2.アニメーションクラス名:

Vue 3 では、アニメーション クラス名を使用して要素をアニメーション化できます。Vue 2 と同様に、要素にクラス名を追加することでアニメーション効果をトリガーできます。

Vue 3 で一般的に使用されるアニメーション クラス名は次のとおりです。

  • enter: 挿入された要素の開始状態。

  • enter-active: 挿入された要素の遷移状態。

  • enter-to: 挿入された要素の終了状態。

  • leave: 要素の開始状態を削除します。

  • leave-active: 要素の遷移状態を削除します。

  • leave-to: 要素の終了状態を削除します。

これらのクラス名の CSS スタイルを定義することで、特定のアニメーション効果を実現できます。

たとえば、単純なフェード アニメーションを実装します。

<template>
  <div :class="animationClass" class="box"></div>
  <button @click="toggle">Toggle</button>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {


    const show = ref(true);

    const toggle = () => {
      show.value = !show.value;
    };

    const animationClass = ref('');

    watch(show, () => {
      animationClass.value = show.value ? 'fade-enter-active' : 'fade-leave-active';
    });

    return {
      show,
      toggle,
      animationClass,
    };
  },
};
</script>

<style>
.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.5s;
}

.fade-enter,
.fade-leave-to {
  opacity: 0;
}
</style>

上の例では、animationClassアニメーション効果は動的バインディングによって実現されています。showの値が変更されると、 の値がshowの値に従って設定されanimationClass、それによって対応するアニメーション効果がトリガーされます。

概要:
Vue 3 では、トランジション コンポーネントとアニメーション クラス名を通じてトランジションとアニメーションの側面を実現できます。Transition コンポーネントは、要素に対するトランジション効果の挿入と削除を制御する機能を提供し、アニメーション クラス名を追加することでアニメーション効果をトリガーできます。これらの改善により、トランジションとアニメーションがより柔軟になり、使いやすくなりました。

9. グローバル API の変更

Vue 3 では、グローバル API に名前の変更やグローバル API の削除など、いくつかの変更が加えられています。これら 2 つの側面の変更を以下に紹介します。

1. グローバル API 名の変更:

Vue 3 では、一部のグローバル API の名前が、その機能と目的をより適切に反映するために変更されました。

  • Vue: Vue 3 では、Vueコンストラクターはデフォルトのエントリ ポイントとしてエクスポートされなくなりました。createApp関数を使用してアプリケーション インスタンスを作成できます。
// Vue 2
new Vue({
    
    
  // ...
});

// Vue 3
import {
    
     createApp } from 'vue';

createApp({
    
    
  // ...
}).mount('#app');
  • filter: Vue 2 では、Vue.filterグローバル メソッドを介してフィルターを登録できましたが、Vue 3 ではフィルターが削除されました。ローカル フィルターまたはカスタム関数を使用して、同じ機能を実現できます。

  • directive: Vue 2 では、Vue.directiveディレクティブはグローバル メソッドを通じて登録できましたが、Vue 3 ではディレクティブが削除されました。カスタム ディレクティブを使用するか、コンポーネント内で直接ディレクティブを使用してグローバル ディレクティブを置き換えることができます。

  • mixin: Vue 2 では、Vue.mixinミックスイン オプションはグローバル メソッドを介して渡すことができましたが、Vue 3 ではミックスイン オプションが削除されました。同じ機能は、Composition API を使用して実現できます。

  • component: Vue 2 では、Vue.componentグローバル コンポーネントはグローバル メソッドを通じて登録できますが、Vue 3 ではコンポーネントの登録方法が変更されました。コンポーネントは、ローカル登録またはアプリケーション インスタンス メソッドを使用して登録できますcomponent

2. グローバル API を削除しました:

名前の変更に加えて、Vue 3 では一部のグローバル API も削除されています。これは、その機能が他の手段で実装できるか、使用が推奨されなくなったためです。

  • v-oncev-once: Vue 2 では、ディレクティブを使用して要素とコンポーネントを 1 回だけレンダリングするようにマークできます。Vue 3 ではv-onceディレクティブが削除され、リアクティブ データと条件付きレンダリングを使用して同じ効果を実現できます。

  • inline-template: Vue 2 では、inline-template属性を使用してコンポーネントのタグ内にコンポーネントのテンプレートを記述することができます。Vue 3 では、inline-templateこの機能は削除されており、単一ファイル コンポーネントまたは文字列テンプレートを通じて同じ機能を実現できます。

  • syncモディファイア: Vue 2 では、syncモディファイアを使用して、親コンポーネントと子コンポーネント間の双方向のバインディングを実現できます。Vue 3 では、sync修飾子が削除され、v-modelイベントへの明示的なバインディングを使用して双方向バインディングを実現できます。

概要:
Vue 3 では、グローバル API に名前の変更や移動などのいくつかの変更が加えられました。

グローバルAPIを除く。これらの変更は、API の一貫性と使いやすさを向上させ、開発者が同じ機能を実現するためにより良い代替手段を使用できるようにすることを目的としています。開発者はこれらの変更を認識し、それに応じてコードを更新する必要があります。

10. ツールとエコシステムの構築

ビルド ツールとエコシステムの点で、Vue 3 では、Vue CLI やサードパーティ ライブラリの適応など、いくつかの改善が導入されています。これら 2 つの側面の変更を以下に紹介します。

1. Vue CLI 与 Vue CLI 2:

Vue CLI は、Vue.js の公式スキャフォールディング ツールであり、Vue プロジェクトを迅速に構築および管理するために使用されます。Vue CLI 2 は Vue 2 時代のバージョンであり、Vue CLI は Vue 3 の新しいバージョンです。

Vue CLI 3 は、Vue CLI 2 と比較して次の点が改善されています。

  • 最新のプラグイン メカニズムを使用して、拡張とカスタマイズをより柔軟かつ簡単にします。

  • Vue CLI UI を通じてグラフィカル インターフェイスが提供され、プロジェクトの構成と管理が容易になります。

  • Vue CLI サービスが導入されました。これは、一般的に使用されるビルド ツールと開発ツールを統合する、拡張可能な基盤となるビルド ツールです。

  • Comboposition API や新しいライフサイクルなど、Vue 3 の新機能をサポートします。

したがって、Vue 3 プロジェクトの場合は、プロジェクトの初期化と管理に Vue CLI を使用することをお勧めします。

2. サードパーティ ライブラリの適応:

Vue 3 のリリースに伴い、多くのサードパーティ ライブラリも Vue 3 の新しい機能と構文をサポートするために適応およびアップグレードされています。一般的に使用されている一部の Vue エコシステム ライブラリは、互換性のある Vue 3 バージョンをリリースしているか、公式ドキュメントで Vue 3 適応ガイドを提供しています。

サードパーティのライブラリを使用する場合は、その公式ドキュメントを参照して、Vue 3 をサポートしているかどうか、および適応する方法を確認することをお勧めします。通常、Vue 3 に適合したサードパーティ ライブラリは、特定のインストールと使用法のガイドラインを提供しており、注意が必要な構文と API の変更がいくつかある場合があります。

さらに、Vue 3 では、@vue/composition-apiVue 2 プロジェクトで作曲 API を使用するために使用できる と呼ばれる公式プラグインも導入されています。このプラグインを使用すると、Vue 2 プロジェクトで Vue 3 の複合 API に段階的に移行することが容易になります。

概要:
ツールとエコシステムの構築に関して、Vue 3 では Vue CLI が更新され、サードパーティ ライブラリが適応されます。Vue CLI 3 を使用して Vue 3 プロジェクトを作成および管理し、サードパーティ ライブラリの公式ドキュメントを確認して、そのサポートと Vue 3 への適応について確認することをお勧めします。これらの改善により、開発者は Vue 3 の新機能とエコシステムをより有効に活用できるようになり、開発効率とコードの品質が向上します。

おすすめ

転載: blog.csdn.net/qq_43326668/article/details/130860380