前面に書かれた最近、Web コンポーネント (WC) に取り組んでおり、いくつかの初期成果を達成しました。しかし、今日は WC をもう一度見ていきたいと思います。 WC とは何でしょうか?簡単に言えば、Web コンポーネントはコンポーネントを HTML タグの形式でカプセル化し、使用時に追加の JS コードは必要ありません。 コンポーネントはフロントエンドの開発方向です。周囲のテクノロジーエコシステムを別にすれば、React と Vue はどちらもコンポーネントフレームワークです。したがって、WC は元のラベルの延長として見ることができます。結局のところ、それはまだラベルです。 Google は Chrome ブラウザを管理しているため、ブラウザのネイティブ コンポーネント、つまり Web コンポーネント API を推進してきました。 サードパーティのフレームワークと比較すると、ネイティブ コンポーネントはシンプルで直接的かつ直感的であり、外部モジュールをロードする必要がなく、コード量も少なくなります。すべてが完璧で、React、Vue などの置き換えにも使えるようです。 現在の欠陥他の Web フレームワークと併用すると、いくつかの小さな問題が発生し、開発エクスペリエンスに問題が発生する可能性があります。 1. コンポーネント内部イベントのコールバックたとえば、ポップアップ コンポーネント ( クラスmyDialogはHTMLElementを拡張します{ // ... 接続されたコールバック() { const shadowRoot = this.attachShadow({ mode: 'open' }); shadowRoot.innerHTML = ` <div class="ダイアログ"> <div class="ダイアログコンテンツ"> <div class="ダイアログボディ"> ポップアップコンテンツ</div> <button id="okBtn">OK</button> </div> </div> `; shadowRoot.querySelector('#okBtn').addEventListener('click', () => { // コンポーネント内のイベントを定義します this.dispatchEvent(new CustomEvent('okBtnFn')); }); } } customElements.define('my-dialog', myDialog); 現在の解決策は、カスタム要素内で <私のダイアログ></私のダイアログ> <スクリプト> エクスポートデフォルト{ 作成された() { document.addEventListener('okBtnFn', 関数(){ // ポップアップボタンをクリックしてコールバックイベントをトリガーします}); } } </スクリプト> 2. コンポーネントスタイルの範囲開発者にとって、コンポーネントの内部スタイルを調整する必要が生じるのは避けられません。 3. コンポーネント内の内部リソースの相対パス問題現在、カスタム要素 v1、テンプレート、HTML インポートを直接ベースとするコンポーネントは、ユーザーの環境を認識せずに、またユーザーに追加の制限を加えずに、内部的にカプセル化されたリソース ファイルを使用することで、完全にリソースに依存しないことはできません。たとえば、カスタム アイコン コンポーネントがある場合: クラス MyIcon は HTMLElement を拡張します { 静的に観測属性を取得します(){['name','size','color']を返します} コンストラクタ() { 素晴らしい(); const shadowRoot = this.attachShadow({ mode: 'open' }); shadowRoot.innerHTML = ` <svg class="icon" id="icon" aria-hidden="true" viewBox="0 0 1024 1024"> <use id="use"></use> </svg> } attributeChangedCallback (名前、古い値、新しい値) { if(name == 'name' && this.shadowRoot){ // 使用中のプロジェクトのルートディレクトリにicon.svgファイルがない場合、gg this.use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', `./icon.svg#icon-${newValue}`); } } } customElements.define('my-icon', MyIcon); 使用しているプロジェクトのルート ディレクトリに icon.svg ファイルがない場合、gg です。ここで CDN パスを使用すると、クロスドメインの問題が発生します。 4. フォームコンポーネント値取得問題Shadow DOM 内の <input>、<textarea>、または <select> タグの値は、フォームに自動的に関連付けられません。 サンプルコード: // ウェブコンポーネント クラス InputAge は HTMLElement を拡張します { コンストラクタ() { 素晴らしい(); } // コンポーネントを接続する 接続されたコールバック() { const shadow = this.attachShadow({ mode: 'closed' }); shadow.innerHTML = `<input type="number" placeholder="age" min="18" max="120" />`; } } // コンポーネントを登録する customElements.define( '入力年齢', InputAge ); WCコンポーネントを使用した後 <フォームid="myform"> <input type="text" name="あなたの名前" placeholder="名前" /> <input-age name="あなたの年齢"></input-age> <button>送信</button> </フォーム> <スクリプト> 定数フォーム = document.getElementById('myform'); フォーム.addEventListener('送信', e => { e.preventDefault(); console.log('送信されたデータ:'); const データ = 新しい FormData(フォーム); for (let nv of data.entries()) { コンソールにログ出力します。 } }); </スクリプト> 送信時に 5. その他さらに、データ バインディングと状態管理の欠如も WC の欠陥ですが、ここでは説明しません。 裏面に記入WCはHTMLのDOM機能を充実させ、HTMLの再利用性を高めることを指します。 WC はネイティブ タグとして使用でき、任意のフロントエンド フレームワークで実行することも、フレームワークなしで実行することもできます。 現在の主流のテクノロジー スタックと組み合わせた場合、WC の主な問題は、複雑なコンポーネントでは、データ通信とイベント配信に一定の使用コストがかかることです。 内部スタイルを上書きできる 上記は、Webコンポーネントの内部イベントコールバックと問題点分析の詳細な内容です。Webコンポーネントのイベントコールバックと問題点の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: CentOS 8 システム FTP サーバーのインストールとパッシブ モードの設定の詳細なチュートリアル
>>: オンラインMySQL自動増分IDが使い果たされた場合の対処方法
コードをコピーコードは次のとおりです。 <!--[if !IE]><!-->...
要素にクラスを追加/削除することは、プロジェクト開発では非常に一般的な動作です。たとえば、Web サ...
背景ブラウザの互換性の問題を解決するのは非常に面倒なことです。高度な技術はそれほど必要ありませんが、...
show processlist コマンドは非常に便利です。MySQL の実行が 50% 以上になる...
一般的に、関数は実行する前に呼び出す必要があることはご存じのとおりです。以下に示すように、関数を定義...
重要なデータはバックアップする必要があり、リアルタイムでバックアップする必要があります。そうしないと...
目次関数フォーマットを即時実行関数を即座に実行する他の方法 – 式即時実行される関数はパラメータを取...
序文Nginxの組み込みモジュールは、同時リクエスト数の制限とリクエストのソースの制限をサポートして...
1. 記事タイトルリストの右側に日付を表示する方法:コードをコピーコードは次のとおりです。 &l...
MySql Nullフィールド判定とIFNULL失敗処理ps: (プロセスを表示したくない場合は、S...
さて、質問させてください。MySQL で列を int(0) に設定すると何が起こりますか?この問題を...
いいえnvmはnodejsの複数のバージョンを管理する役割を担っています。インストール: https...
この記事の例では、テーブルを追加および削除するためのjsの具体的なコードを参考までに共有しています。...
初回の読み込みを高速化できるルートの遅延読み込みをどうして忘れられるでしょうか?ルーティングの遅延読...
MySQL 自体はファイルシステムに基づいて開発されましたが、ロックの存在が異なります。データベース...