Vue3 のレンダリング関数における互換性のない変更の詳細な説明

Vue3 のレンダリング関数における互換性のない変更の詳細な説明

レンダリングAPIの変更

この変更は<template>ユーザーに影響しません

  • h はレンダリング関数に引数として渡されるのではなく、グローバルにインポートされるようになりました。
  • レンダリング関数のパラメータが変更され、ステートフルコンポーネントと関数コンポーネント間の一貫性が向上しました。
  • vnode はフラットな prop 構造を持つようになりました

レンダリング関数のパラメータ

// 2.0 レンダリング関数 export default {
 レンダリング(h) {
  h('div') を返す
 }
}

// 3.x 構文 export default {
 与える() {
  h('div') を返す
 }
}

レンダリング関数のシグネチャの変更

// 2.x
エクスポートデフォルト{
 レンダリング(h) {
  h('div') を返す
 }
}

// 3.x
'vue' から { h, reactive } をインポートします
エクスポートデフォルト{
 セットアップ(prop, {スロット, 属性, 出力}) {
  定数状態 = リアクティブ({
   カウント: 0
  })
  関数の増分() {
   状態.count++
  }
  // レンダリング関数に戻る return () => h(
   'div',
   {
    onClick: 増加
   },
   状態数
  )
 }
}

VNode プロパティのフォーマット

// 2.x
{
 クラス: ['button', 'is-outlined'],
 スタイル: {色: '#fffff'},
 属性: {id: '送信'},
 domProps: {innerHTML: ''},
 オン: {クリック: 送信フォーム},
 キー: '送信ボタン'
}
// 3.x VNode構造はフラットです{
 クラス: ['button', 'is-outlined'],
 スタイル: { 色: '#34495E' },
 id: '送信',
 内部HTML: ''、
 onClick: 送信フォーム、
 キー: '送信ボタン'
}

スロット統合

通常のスロットとスコープ付きスロットを変更しました

  • this.$slots はスロットを関数として公開するようになりました
  • これを削除します。$scopedSlots
// 2.x
h(レイアウトコンポーネント、[
 h('div', {スロット: 'header'}, this.header),
 h('div', {スロット: 'header'}, this.header)
])
// スコープスロット:


// 3.x
h(レイアウトコンポーネント、{}、{
 ヘッダー: () => h('div', this.header),
 コンテンツ: () => h('div', this.content)
})
// プログラム的にスコープ付きスロットを導入する必要がある場合、それらは $slots オプションに統合されるようになりました // 2.x スコープ付きスロット
this.$scopedSlots.header
// 3.x ではこれを書きます。$slots.header

$listeners を削除する

$listenersオブジェクトはvue3で削除され、イベントリスナーは$attrsの一部になりました。

Vue2 では、this.attrs と this.attrs および this.listeners を使用して、それぞれコンポーネントに渡される属性とイベント リスナーにアクセスできます。inheritAttrs: false と組み合わせることで、開発者はこれらの属性とリスナーをルート要素ではなく他の要素に適用できます。

<テンプレート>
<ラベル>
 <input type="text" v-bind="$attrs" v-on="$listeners">
</ラベル>
</テンプレート>
<スクリプト>
 エクスポートデフォルト{
  継承属性: false
 }
</スクリプト>

Vue の仮想 DOM では、イベント リスナーは on というプレフィックスが付いた属性になり、attrs オブジェクトの一部になったため、リスナーは削除されます。

<テンプレート>
 <ラベル>
  <input type="text" v-bind="$attrs" />
 </ラベル>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
 継承属性: false
}
// このコンポーネントが id 属性と v-on:close リスナーを受け取った場合、$attrs オブジェクトは次のようになります {
 id: 'my-input',
 onClose: () => console.log('close イベントがトリガーされました')
}
</スクリプト>

$attrs にクラスとスタイルが含まれるようになりました

これで$attrにはクラスやスタイルを含むすべての属性が含まれるようになりました

2.xでは、仮想DOMはクラスとスタイルを特別に処理するため、それらは$attrに含まれず、inheritAttr: falseを使用すると副作用が発生します。

  • $attrs 内の属性はルート要素に自動的に追加されなくなりましたが、どこに追加するかは開発者が決定します。
  • ただし、class と style は $attrs に属していないため、コンポーネントのルート要素に適用されます。
<テンプレート>
 <ラベル>
  <input type="text" v-bind="$attrs" />
 </ラベル>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
 継承属性: false
}
</スクリプト>
<!-- 書き込み -->
<my-component id="my-id" class="my-class"></my-component>
<!-- vue2 は以下を生成します -->
<label class="私のクラス">
 <input type="text" id="私のID" />
</ラベル>
<!-- vue3 は以下を生成します -->
<ラベル>
 <input type="text" id="私のID" class="私のクラス" />
</ラベル>

以上がvue3におけるレンダリング機能の非互換な変更についての詳しい説明です。vueレンダリング機能の非互換な変更についての詳細は、123WORDPRESS.COM内の他の関連記事にも注目してください!

以下もご興味があるかもしれません:
  • Vueレンダリング関数renderの使い方の詳しい説明
  • Vueレンダリング機能の詳しい説明
  • Vue で jsx 構文を正しく使用する方法
  • React-vscode で jsx 構文を使用する際の問題と解決策
  • JSX を使用してコンポーネント パーサー開発を構築する例
  • JSX を使用してカルーセル コンポーネントを実装する方法 (フロントエンドのコンポーネント化)
  • Vueコンポーネントjsx構文の具体的な使用
  • Vue jsx の使用ガイドと vue.js での jsx 構文の使用方法
  • Vue が JSX 構文をサポートする方法の詳細な説明
  • レンダリング関数と JSX の詳細

<<:  MySQL 5.7.18 の解凍バージョンをダウンロードしてインストールし、MySQL サービスを開始するための詳細なグラフィック手順

>>:  Linux でコマンドまたはプロセスの実行時間を調べる方法

推薦する

CSS3は円錐グラデーション効果を実現します

文法:背景画像: 円錐グラデーション(位置の角度から、開始色、...、最後の色)最初のパラメータ:開...

優れた Web UI ライブラリ/フレームワーク 10 選

1. ITミルツールキットIT Mill Toolkit は、リッチ Web アプリケーション用のウ...

MySQL データベースのマスター・スレーブ レプリケーションと読み取り/書き込み分離

目次1. マスタースレーブレプリケーションマスタースレーブレプリケーション3スレッドマスタースレーブ...

Docker で Python スクリプトを実行する方法

まず、Docker イメージ用の特定のプロジェクト ディレクトリを作成します。例: mkdir /h...

CSS フィルターを使用してマウスオーバー効果を記述する例

CSSフィルターを使用してマウスオーバー効果を記述する <div class="fi...

MySQL ロック制御同時実行方法

目次序文1. 楽観的ロックバージョンフィールドを追加する2. 悲観的ロック読み取りロック完全なテーブ...

Nginx で https をアップグレードする方法

購入証明書Alibaba CloudのCloud Shield証明書サービスから購入できます。証明書...

CSS の overflow: hidden の使い方 (オーバーフローの非表示とフロートのクリア)

オーバーフロー非表示指定された高さを超えるテキストや画像情報を非表示にすることを意味します。 <...

CentOS 6 は Docker を使用して Redis マスター スレーブ データベース操作例を展開します

この記事では、Docker を使用して Centos6 に Redis マスター/スレーブ データベ...

MySQL における 10 進数型の使用法の簡単な紹介

MySQL でサポートされている浮動小数点型は、 FLOAT 、 DOUBLE 、およびDECIMA...

Windows2008 64 ビット システムでの MySQL 5.7 グリーン バージョンのインストール チュートリアル

序文この記事では、MySQL 5.7 グリーン バージョンのインストール チュートリアルを紹介します...

VMware ESXi6.7 の簡単なセットアップ(画像とテキスト付き)

1. VMware vSphere の概要VMware vSphere は、業界をリードする最も信...

Ember.js と Vue.js の詳細な比較

目次概要フレームワークを選択する理由は何ですか? js のエンバーEmber.js と Vue.js...

Vue で CSS カスタム変数を使用する方法

目次CSS カスタム変数機能は古くから存在していますが、実際の開発ではあまり使用されていません。その...

JavaScript で配列の変更を監視する方法

序文以前、defineProperty を紹介したとき、オブジェクトの変更のみを監視でき、配列の変更...