序文また怠ける時間です。無駄にはできないと思います。H5 ページに vant を使っています。ソース コードに興味があったので、git から vant ソース コードのコピーを取得しました。すべてのコンポーネントが jsx で記述されていることが判明したので、vue で jsx を使用する方法を調べ始めました。 仮想DOM仮想DOMとはその前に、まずは仮想 DOM について理解しましょう。Vue と React フレームワークはどちらも内部的に仮想 DOM を使用しています。その理由は、JS を通じて DOM を操作する計算コストが非常に高いためです。JS は非常に高速に更新されますが、DOM を見つけて更新するコストは非常に高くなります。では、どのような方法で最適化できるでしょうか? Vue などのフレームワークは js オブジェクトを使用します。js オブジェクトは変更され、バッチ処理されて DOM を一度に更新します。したがって、仮想 DOM は本質的に js オブジェクトです。 仮想DOMの利点
レンダリング関数とは何ですか?レンダリング関数は仮想 DOM を生成するために使用されます。テンプレート構文を単一のvueファイルに記述し、最終的には基礎となる実装のレンダリング関数にコンパイルされます。 Vue では、ほとんどの場合、テンプレートを使用して HTML を作成することを推奨しています。ただし、シナリオによっては、JavaScript の完全なプログラミング能力が本当に必要になる場合があります。この場合、テンプレートよりもコンパイラに近いレンダリング関数を使用できます。 次のようなシナリオが発生した場合、次の書き方で目的の効果を達成できますが、長くなるだけでなく、レベルタイトルごとに繰り返すことになります。アンカー要素を追加すると、各v-if/v-else-ifブランチでそれを再度繰り返す必要があります。 const {createApp} = Vue const アプリ = createApp({}) app.component('アンカー付き見出し', { テンプレート: ` <h1 v-if="レベル === 1"> <スロット></スロット> </h1> <h2 v-else-if="レベル === 2"> <スロット></スロット> </h2> <h3 v-else-if="レベル === 3"> <スロット></スロット> </h3> <h4 v-else-if="レベル === 4"> <スロット></スロット> </h4> <h5 v-else-if="レベル === 5"> <スロット></スロット> </h5> <h6 v-else-if="レベル === 6"> <スロット></スロット> </h6> `、 小道具: { レベル: タイプ: 数値、 必須: true } } }) テンプレートはほとんどのコンポーネントでうまく機能しますが、ここでは明らかに適切ではありません。それでは、render 関数を使用して上記の例を書き直してみましょう。 const { createApp, h } = Vue const アプリ = createApp({}) app.component('アンカー付き見出し', { 与える() { h(を返す 'h' + this.level, // タグ名 {}, // プロパティ/属性 this.$slots.default() // 子の配列 ) }, 小道具: { レベル: タイプ: 数値、 必須: true } } }) jsxこのようにレンダリング関数を書くのは少し面倒です。テンプレートに近い形で書く方法はありますか?Vueは、Vueがjsxの記述をサポートするようにするためのbabel-plugin-jsx babelプラグインを提供しています。 私は vuecli を使用して vue3 + ts プロジェクトを作成します。スキャフォールディングでは、jsx と ts の関連する依存関係が統合されています。 Vue3 で JSX を書く 2 つの方法ファイルのサフィックスをvueからtsxまたはjsxに直接変更する vue3では、レンダリングオプションを直接使用して次のように記述できます。 「vue」からdefineComponentをインポートします。 エクスポートデフォルトdefineComponent({ 名前: "Jsx", 与える() { <div>私はdivです</div>を返します。 }, }); セットアップで戻ることもできます 「vue」からdefineComponentをインポートします。 エクスポートデフォルトdefineComponent({ 名前: "Jsx", 設定() { return () => <div>私はdivです</div>; }, }); どちらの方法も、個人の好みに応じて受け入れ可能です。setup ではこれにアクセスできませんが、render ではこれを介して現在の Vue インスタンスにアクセスできます。 使用法クラス バインディングは react の jsx バインディングとは異なります。React は className を使用し、vue は class を使用します。 設定() { return () => <div class="test">私はdivです</div>; }, スタイルバインディング 設定() { return () => <div style={{ color: "red" }}>私はdivです</div>; }, プロップバインディング // 親コンポーネントのセットアップ() { 戻り値 () => ( <div style={{ color: "赤" }}> <span>私は親コンポーネントです</span> <Mycom msg={"私は親コンポーネントから渡された値です"} /> </div> ); // サブコンポーネント、setupの最初のパラメータはpropsで値を取得できます setup(props) { return () => <div>私は子コンポーネントです {props.msg}</div>; }, イベントバインディング 設定() { 関数eventClick() { console.log("クリック"); } return () => <button onClick={eventClick}>ボタン</button>; }, コンポーネントのカスタムイベント // サブコンポーネント import { defineComponent } from "vue"; エクスポートデフォルトdefineComponent({ 名前:「マイコム」 発行: ["イベント"], セットアップ(props, { 出力 }) { 関数sendData() { emitting("event", "サブコンポーネントによって渡されたデータ"); } 戻り値 () => ( <div> <span>カスタム イベント</span> <button onClick={sendData}>データを送信</button> </div> ); }, }); // 親コンポーネント // @ts-nocheck // これは jsx では問題ありませんが、tsx では ts 型エラーが報告されるため、上記の現在のファイル ts 監視 @ts-nocheck を無視しました。 「vue」からdefineComponentをインポートします。 Mycomを「./mycom」からインポートします。 エクスポートデフォルトdefineComponent({ 名前: "Jsx", 設定() { 関数 getSon(msg: 文字列) { コンソールログ(メッセージ); } 戻り値 () => ( <div> <Mycom onEvent={getSon} /> </div> ); }, }); ts型エラーもこの方法で解決できます 設定() { 関数 getSon(msg: 文字列) { コンソールログ(メッセージ); } 戻り値 () => ( <div> <Mycom {...{ onEvent: getSon }} /> </div> ); }, スロット // 親コンポーネントのセットアップ() { 定数スロット = { テスト: () => <div>名前付きスロット</div>, デフォルト: () => <div>デフォルトスロット</div>, }; 戻り値 () => ( <div> <Mycom v-slots={スロット}></Mycom> </div> ); }, セットアップ(props, { スロット }) { // サブコンポーネント return () => ( <div> <span>スロット</span> {スロット.default?.()} {スロット.テスト?.()} </div> ); }, v-if、v-for などの命令は jsx では使用できません。jsx は v-model および v-show 命令のみをサポートしています。 設定() { const inputData = ref(""); 戻り値 () => ( <div> <span v-show={true}>表示</span> <span v-show={false}>非表示</span> <input type="text" v-model={inputData.value} /> <span>{入力データ値}</span> </div> ); }, やっとさっそく、vantのソースコードを開いて、src => button => button.tsxを読んで最初のコンポーネントのソースコードを開く準備をします。 これで、vue での jsx の正しい使用に関するこの記事は終了です。vue での jsx の使用に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。 参照する
以下もご興味があるかもしれません:
|
<<: VMware仮想マシンにLinux(CentOS)をインストールするための詳細な構成手順
>>: Windows に MySQL をインストールする方法のグラフィック チュートリアル
1. 50と93では鏡像が消える [root@h50 /]# df -h ファイルシステムの使用済み...
Dockerはますます普及しています。環境を軽量かつ柔軟に分離し、容量を拡張し、運用保守管理を容易に...
文法以下は、MySQL テーブルにデータを挿入するための INSERT INTO コマンドの一般的な...
それは何ですか? GNU Parallel は、1 台以上のコンピュータでコンピューティング タスク...
目次1. SELinux の紹介2. SELinuxの基本概念2.1 仕事の種類2.2. セキュリテ...
構造とパフォーマンスの紹介HTML 構造、CSS 表現、JavaScript 動作。Web ページの...
目次1. データベース操作2. データ型3. バックアップとリカバリ3. 操作4. 上級5. 知識補...
2時間近くかけて、さまざまな方法を試しました。後で、whereでフィルタリングした後のデータ量が1ペ...
1. 環境整備各コンテナの IP アドレス: nginx: 172.16.10.10マイSQL: 1...
目次ビジネスシナリオ:効果のデモンストレーション:ビジネスシナリオ: el-form を使用する場合...
mysql5.7.18の解凍版はmysqlサービスを起動します。具体的な内容は以下のとおりです。 1...
1. インストールパッケージの準備VMware-player-15.0.4-12990004、非商...
シェルスクリプト #!/bin/sh # 現在のディレクトリ CURRENT_DIR=$( cd &...
Union は、重複行を除外し、デフォルトのソートを実行する、データに対する結合操作です。Union...
一般的に、マウスは上向きの斜め矢印として表示され、テキストの上に移動すると垂直線になり、ハイパーリン...