Svelte は長い間存在しており、私はいつもわかりやすい原理分析記事を書きたいと思っていました。長い間先延ばしにしていましたが、ついにそれを書きました。 デモ1まず、コンパイル プロセスを見てみましょう。次の <h1>{カウント}</h1> <スクリプト> count = 0 とします。 </スクリプト> このコードはコンパイラによってコンパイルされると、次の 3 つの部分で構成されるコードを生成します。
// 一部のコードを省略します... 関数create_fragment(ctx) { h1とします。 戻る { c() { h1 = 要素("h1"); h1.textContent = `${count}`; }, m(ターゲット, アンカー) { 挿入(ターゲット、h1、アンカー); }, d(切り離し) { if (デタッチ) detach(h1); } }; } count = 0 とします。 クラスAppはSvelteComponentを拡張します{ コンストラクタ(オプション) { 素晴らしい(); init(this、オプション、null、create_fragment、safe_not_equal、{}); } } デフォルトのアプリをエクスポートします。 フラグメントの作成まず、 h1 = 要素("h1"); h1.textContent = `${count}`; 挿入(ターゲット、h1、アンカー); 関数挿入(ターゲット、ノード、アンカー) { target.insertBefore(ノード、アンカー || null); } if (デタッチ) detach(h1); 関数 detach(ノード) { ノードの親ノードを削除します。 } フローチャートをよく見ると、 これは、 スヴェルトコンポーネント各コンポーネントは、 クラスAppはSvelteComponentを拡張します{ コンストラクタ(オプション) { 素晴らしい(); init(this、オプション、null、create_fragment、safe_not_equal、{}); } } 要約すると、
状態を変更できるデモここで、 <h1 on:click="{update}">{count}</h1> <スクリプト> count = 0 とします。 関数 update() { カウント++; } </スクリプト> コンパイルされた製品の変更、および // モジュールのトップレベルの宣言から let count = 0; // インスタンスメソッドになる function instance($$self, $$props, $$invalidate) { count = 0 とします。 関数 update() { $$ 無効化(0, count++, count); } [count, update]を返します。 } // テンプレートに3つのアプリを定義する <アプリ/> <アプリ/> <アプリ/> // count が不変の場合、ページは次のようにレンダリングされます: <h1>0</h1> <h1>0</h1> <h1>0</h1> <h1>0</h1> <h1>3</h1> <h1>1</h1> したがって、各
見つかった変数は 同時に、上記の操作を実行するステートメントがテンプレートを通じて参照できる場合、そのステートメントは
したがって、コンパイルされた // ソースコードの更新 関数 update() { カウント++; } // コンパイルされたインスタンスで更新 関数 update() { $$ 無効化(0, count++, count); }
c() { h1 = 要素("h1"); //countの値はctxから取得されます t = text(/*count*/ ctx[0]); }, m(ターゲット, アンカー) { 挿入(ターゲット、h1、アンカー); 追加(h1, t); // イベントバインディング dispose = listen(h1, "click", /*update*/ ctx[1]); }, p(ctx, [ダーティ]) { // set_data は t に格納されているテキスト ノードを更新します。if (dirty & /*count*/ 1) set_data(t, /*count*/ ctx[0]); }, d(切り離し) { if (デタッチ) detach(h1); // イベントのバインド解除 dispose(); } // UI 内の複数の状態を参照する<h1 on:click="{count0++}">{count0}</h1> <h1 on:click="{count1++}">{count1}</h1> <h1 on:click="{count2++}">{count2}</h1> 対応する p(new_ctx, [ダーティ]) { ctx = new_ctx; if (dirty & /*count*/ 1) set_data(t0, /*count*/ ctx[0]); if (dirty & /*count1*/ 2) set_data(t2, /*count1*/ ctx[1]); if (dirty & /*count2*/ 4) set_data(t4, /*count2*/ ctx[2]); },
上記は、JavaScript 開発における Svelte の実装原則の詳細な説明の詳細な内容です。Svelte の実装原則の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
>>: HTML+CSS で div タグの右上隅に削除アイコンを追加するサンプルコード
目次序文🍹準備🍲vue3 の使い方🍖 実装要約する序文最近、私の最初の公式 vue3 + ts プロ...
1: syslog.conf の概要異なるタイプの Unix の場合、標準の UnixLog システ...
目次1. copy_{to,from}_user() とは何か1. copy_{to,from}_u...
方法1: CSSオーバーフロー省略を使用して解決する解決策は次のとおりです。 CSSコード: ディス...
この記事では、MySQL マスターとスレーブ データ間の不一致の解決方法と、プロンプト「Slave_...
目次前面に書かれた1. Ngixnイメージの作成2. Java Web (Tomcat) アプリケー...
CentOS 8 ではソフトウェア パッケージのインストール プログラムが変更され、yum 構成方法...
MySQLマスタースレーブを設定した後、スレーブの状態が正常かどうかわからないことが多く、例外が発生...
この投稿では、キャンバスとドラッグ可能なノード インターフェースを使用するデスクトップおよび Web...
FRAME プロパティを使用して、表の境界線のスタイル タイプを制御します。基本的な構文<T...
ダウンロードとインストール環境変数の設定インストール環境変数の設定確認基本的な描画の紹介グラフディグ...
Docker はコンテナに相当し、必要な動作環境に応じて対応する動作環境を構築できます。このとき、各...
ドロップダウン メニューやスライド メニューを使用している Web サイトをたくさん見つけたので、私...
ソフトウェアバージョンウィンドウズ: ウィンドウズ10 MySQL: mysql-8.0.17-wi...
Element-UI に慣れた開発者なら、無限スクロールの InfiniteScroll が使いにく...