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 でコマンドまたはプロセスの実行時間を調べる方法

推薦する

CSS 要約ノート: 変換、遷移、アニメーションの例

1.移行遷移プロパティの使用法: transition :transition-property t...

MySQL 8.0.16 winx64 のインストールと設定方法のグラフィックチュートリアル

最近、データベースについて学び始めました。最初にやったことは、データベースとは何か、データベースとデ...

HTMLリンクを書くときは、HTTPリクエストを減らすためにサブフォルダに必ずスラッシュを追加してください。

サブフォルダーの末尾にスラッシュがない場合、2 つの HTTP リクエストが生成され、効率に影響しま...

Linux システムで Tomcat を自動的に起動するための設定方法の紹介

1. /etc/init.d ディレクトリに入ります: cd /etc/init.d 2. tomc...

純粋な CSS3+DIV で小さな三角形の境界線効果を実現するためのサンプル コード

具体的なコードは次のとおりです。 HTMLコードは次のとおりです <div class=&qu...

JavaScript における BOM と DOM の詳細な説明

目次BOM (ブラウザ オブジェクト モデル) 1. ウィンドウブラウザのウィンドウサイズを取得する...

Alibaba Cloud ドメイン名と IP バインディングの手順と方法

1 Alibaba Cloud コンソールに入り、ドメイン名コンソールを見つけて、バインドするドメイ...

3Dカルーセル効果を実現するjs

この記事では、3Dカルーセル効果をjsで実装するための具体的なコードを参考までに共有します。具体的な...

MySql 8.0 と対応するドライバー パッケージの一致に関する注意事項

MySql 8.0 対応ドライバパッケージのマッチングMySql データベースをバージョン 8.0 ...

MySQL でのワイルドカードを使用したファジークエリの実装に関する簡単な説明

MySQL データベースでは、あいまいクエリが必要な場合にワイルドカードを使用します。まず、演算子と...

プロジェクトにaxiosをカプセル化する実際のプロセス

目次序文axiosカプセル化の利点パッケージのアイデア設定の優先順位axiosインスタンス構成1. ...

mysql5.7 ユーザー権限の作成、ユーザーの削除、権限の取り消し

1. ユーザーを作成します。注文: 'password' によって識別される ...

IDEA 2020 で Tomcat サーバーを構成するための詳細な手順

IDEA 2020 で Tomcat を構成する手順は次のとおりです。最初のステップはTomcatを...

Docker で nginx のログレベルを調整する方法

目次はじめにNginx Dockerファイル新しい会議もっと参考文献はじめに最近、アプリケーションの...

CSS3プロパティline-clampはテキスト行の使用を制御します

説明: ブロック要素に表示されるテキストの行数を制限します。 -webkit-line-clamp ...