序文また怠ける時間です。無駄にはできないと思います。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. 関連概念1.1 Jenkins の概念: Jenkins は、使用されるプラットフォームに関係...
目次はじめるデータストレージサーバーを構成するRedis セキュリティの管理Redisインストールの...
今日、MySQLサービス1067エラー問題に遭遇しました。システムアカウントを使用するように設定して...
目次概要1. 依存性注入2. Angularの依存性注入フレームワーク概要依存性注入: デザインパタ...
目次ビジネス要件:解決策 1: vuex-persistedstate解決策2: vuex-pers...
luaをインストールする http://luajit.org/download/LuaJIT-2.0...
序文docker イメージを削除できません。docker docker imagesを確認すると、イ...
環境: 1. Windows Server 2016 Datacenter 64 ビット 2. SQ...
Docker は、開発者やシステム管理者がアプリケーションを軽量コンテナとして構築およびパッケージ化...
目次1. Jquery を使用する手順: (1)jsライブラリをインポートする(2)ページ読み込みイ...
1. CentOS 7 仮想マシンを開きます。 2. 仮想マシンにログインし、リストにないユーザー名...
<br />一部のWebサイトでアップロードする場合、「参照」ボタンをクリックすると[フ...
<br />私はいつもYahooのウェブデザインが素晴らしいと信じてきました。しかし、こ...
ページをナビゲートする2つの方法宣言型ナビゲーション: リンクをクリックしてナビゲーションを実現する...
効果: <div class="imgs"> <!-- 背景画...