vue3 のコンポーネントの互換性のない変更の詳細な説明

vue3 のコンポーネントの互換性のない変更の詳細な説明

機能コンポーネント

単一ファイルコンポーネント(SFC)<template>の機能属性が削除されました
関数を介してコンポーネントを作成する際の{ functional: true }オプションが削除されました

// 適切な見出し (つまり、h1、h2、h3 など) を提供する <dynamic-heading> コンポーネントを使用します。2.x では、これはおそらく単一のファイル コンポーネントとして記述されます。
// Vue 2 関数コンポーネントの例 export default {
 機能的: 真、
 プロパティ: ['レベル'],
 レンダリング(h, { props, data, children }) {
 h(`h${props.level}`, データ, 子) を返します
 }
}

// <template> を使用した Vue 2 関数コンポーネントの例
<テンプレート機能>
 <コンポーネント
 :is="`h${props.level}`"
 v-bind="属性"
 v-on="リスナー"
 />
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 小道具: ['レベル']
}
</スクリプト>

Vue 3 では、すべての関数コンポーネントは通常の関数を使用して作成されるため、{ functional: true } コンポーネント オプションを定義する必要はありません。
props と context という 2 つのパラメータを受け取ります。コンテキスト パラメータは、コンポーネントの属性、スロット、および発行プロパティを含むオブジェクトです。
さらに、レンダリング関数で h を暗黙的に提供するのではなく、 h がグローバルにインポートされるようになりました。
前述の <dynamic-heading> コンポーネントの例を使用すると、次のようになります。

//vue3.0
'vue' から { h } をインポートします
const DynamicHeading = (props, context) => {
 h(`h${props.level}`, context.attrs, context.slots) を返します
}
DynamicHeading.props = ['レベル']
デフォルトのDynamicHeadingをエクスポートする
// Vue3.0 単一ファイル書き込み <template>
 <コンポーネント
 v-bind:is="`h${$props.level}`"
 v-bind="$attrs"
 />
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 小道具: ['レベル']
}
</スクリプト>

主な違いは

<template> 内のリスナーを削除する機能属性が $attrs の一部として渡され、削除できるようになりました。

非同期コンポーネントの書き方とdefineAsyncComponentメソッド

非同期コンポーネントを明示的に定義するには、defineAsyncComponentヘルパーメソッドを使用します。
コンポーネントオプションの名前がローダーに変更されました
Loader関数自体はresolveとrejuctパラメータを受け入れなくなり、Promiseを返す必要があります。

// vue2.x
// 以前は、非同期コンポーネントは、Promise を返す関数としてコンポーネントを定義することによって作成されていました。const asyncPage = () => import('./NextPage.vue')
// またはオプションとして作成します const asyncPage = {
 コンポーネント: () => import('./NextPage.vue'),
 遅延: 200、
 タイムアウト: 3000、
 エラー: ErrorComponent、
 読み込み中: LoadingComponent
}

// vue3.x
vue3.xでは、defineAsyncComponentを使用してimport{defineAsyncComponent} from 'vue'を定義する必要があります。
'./components/ErrorComponent.vue' から ErrorComponent をインポートします。
'./components/LoadingComponent.vue' から LoadingComponent をインポートします。

// オプションなしの定義メソッド const asyncPage = defineAsyncComponent(() => import('./NextPage.vue'))

// オプション付き非同期コンポーネント constasyncPageWithOptions = defineAsyncCopmonent({
 ローダー: () => import('./NextPage.vue'),
 遅延: 200、
 タイムアウト: 3000、
 エラーコンポーネント: エラーコンポーネント、
 ロードコンポーネント: ロードコンポーネント
})

ローダー関数は、resolve および deny パラメータを受け入れなくなり、常に Promise を返す必要があります。

// vue2.x
const oldAsyncComponent = (解決、拒否) => {}
// vue3.x
const asyncComponent = defineAsyncComponent(() => 新しい Promise((resolve, deny) => {}))

コンポーネントイベントはemitsオプションで宣言する必要がある

Vue3 では、props オプションに似た、emits オプションが提供されるようになりました。このオプションを使用すると、コンポーネントが親オブジェクトに発行するイベントを定義できます。

<!-- vue2.x -->
<テンプレート>
 <div>
 <p>{{ テキスト }}</p>
 <button v-on:click="$emit('accepted')">OK</button>
 </div>
</テンプレート>
<スクリプト>
 エクスポートデフォルト{
 プロパティ: ['テキスト']
 }
</スクリプト>

<!-- vue3.x -->
<!-- props と同様に、emits を使用してコンポーネントによって発行されるイベントを定義できるようになりました -->
<!-- このオプションは、props などの渡されたパラメータを検証するために使用される特定のオブジェクトも受け取ります-->
<!-- 各コンポーネントからのすべての発行を記録することを強くお勧めします。.native 修飾子がない場合、宣言されていないイベントのすべてのリスナーがコンポーネントの $attr に含まれ、デフォルトではコンポーネントのルート ノードにバインドされるためです -->
<テンプレート>
 <div>
 <p>{{ テキスト }}</p>
 <button v-on:click="$emit('accepted')">OK</button>
 </div>
</テンプレート>
<スクリプト>
 エクスポートデフォルト{
 プロパティ: ['テキスト'],
 発行: ['accepted']
 }
</スクリプト>

以上がvue3のコンポーネントの非互換な変更についての詳しい説明です。vue3のコンポーネントの非互換な変更についての詳細は、123WORDPRESS.COMの他の関連記事もご覧ください!

以下もご興味があるかもしれません:
  • Vue マルチ選択リスト コンポーネントの詳細な説明
  • Vue で親子コンポーネントの値を双方向バインドするために v-model を使用するときに発生する問題と解決策
  • トランジションコンポーネントのアニメーション効果を使用した Vue サンプルコード
  • Vueコンポーネントの基本のまとめ
  • Vue の動的コンポーネントと非同期コンポーネントの詳細な理解
  • Vue が Ref を使用してレベル間でコンポーネントを取得する手順
  • Vueはマルチタブコンポーネントを実装します
  • Vue3でスイッチ関数コンポーネントのプロセス全体を簡単に実装する
  • Vue3 でダイアログとモーダル コンポーネントをカスタマイズする方法
  • Vue でコンポーネントを強制的に再レン​​ダリングする正しい方法
  • Vueでコンポーネントを動的に作成する2つの方法

<<:  MySQLバイナリログを介してデータベースデータを復元する方法の詳細な説明

>>:  Nginx 逆生成 Mogilefs 分散ストレージ例の詳細な説明

推薦する

MySQL での外部キーの作成、制約、削除

序文MySQL バージョン 3.23.44 以降では、InnoDB エンジン タイプのテーブルは外部...

MySQL データベース インデックスが B+ ツリーの使用を選択するのはなぜですか?

MySQL データベース インデックスが B+ ツリーを使用する理由をさらに分析する前に、データ構...

Three.js が Facebook Metaverse 3D ダイナミック ロゴ効果を実現

目次背景メタバースとは何ですか?成果を達成するトライアル 1: THREE.TorusGeometr...

JavaScript BOMの構成と一般的なイベントの詳細な説明

目次1. 部品2. BOMの構成2. ウィンドウオブジェクトの共通イベント1. ウィンドウ読み込みイ...

Navicat がデータベース データ構造をインポートする際に発生するエラー datetime(0) の SQL レポートの問題を解決します。

エラー発生: MySQL 5.7 から SQL にデータベースをエクスポートし、それを MySQL ...

MySQL データベースの最適化: テーブルとデータベースのシャーディング操作の詳細な説明

この記事では、例を使用して、MySQL データベースの最適化のためのテーブルおよびデータベース シャ...

MySQLメモリストレージエンジンに関する知識

メモリストレージエンジンに関する知識ポイントメモリ ストレージ エンジンは日常業務ではほとんど使用さ...

Docker は MySQL をインストールし、中国語の文字化けの問題を解決します

目次1. MySQLイメージを取得する2. ダウンロードが完了したか確認する3. MySQLはローカ...

HTML における画像タグの使用方法の詳細な説明

HTML では、<img> タグはテキスト内の画像タグを定義するために使用されます。その...

Ubuntu Server でのワイヤレス ネットワーク カードの詳細な設定

1. ワイヤレス ネットワーク カードを挿入し、コマンドiwconfigを使用してワイヤレス ネット...

VUEはトークンログイン認証を実装

この記事では、トークンログイン認証を実装するためのVUEの具体的なコードを例として紹介します。具体的...

マウスのドラッグ効果を実現するJavaScript

この記事では、マウスドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

CSS の 4 つのインポート方法と優先順位の簡単な分析

第一に: CSSを導入する4つの方法CSS を導入する方法には、インライン スタイル、埋め込みスタイ...

CSS エクスペリエンスを充実させる 5 つの便利な CSS セレクターを紹介します

Web デザイナーとして豊富な CSS 経験を持つ私たちは、あらゆる種類のコード構文、互換性、スニペ...

jQueryはフェードインとフェードアウト効果を実現します

jQuery を使用してフェードインとフェードアウト効果を完成させる前に、まずいくつかのコードを理解...