ホームページ > 記事 > ウェブフロントエンド > JavaScript フレームワーク (xmlplus) コンポーネントの紹介 (5) タブバー
xmlplus は、フロントエンドおよびバックエンド プロジェクトを迅速に開発するための JavaScriptフレームワーク です。この記事では、主に xmlplus コンポーネント設計シリーズのタブを紹介します。興味のある方は参考にしてください。この章では、携帯端末で使用されるタブ コンポーネントを設計します。ここに回路図を示します。図:
タブの構成
具体的な実装の前に、対象コンポーネントがどのように使われるかを想像してみると、設計に大いに役立ちます。調べてみると、次の XML 構造に示すように、タブ コンポーネントはコンテナ部分と子部分に分割できます。
<Tabbar id="tabbar"> <TabItem id="home" label="首页"/> <TabItem id="setting" label="设置"/> <TabItem id="logs" label="日志"/> <TabItem id="about" label="关于"/> </Tabbar>
次に、タブコンポーネントのサブ項目部分に注目を切り替え、サブ項目部分がどのように分解されるかを見てみましょう。この図から、子セクションは子コンテナと、アイコンとテキストを含む子セクションに分割できることがわかります。
<a id="tabitem"> <Icon id="icon"/> <span id="label">首页</span> </a>
ということで、目標は非常に明確になり、主にアイコン コンポーネント Icon、タブ コンポーネントのサブ項目 TabItem、タブ コンポーネントのコンテナ Tabbar の 3 つのコンポーネントを設計します。
構造図
このコンポーネントは比較的単純なので、3 つのサブコンポーネントを同じレベルに配置できます。ただし、アイコン コンポーネントも 4 つあり、それらを保持する子を作成できることに注意してください。コンポーネント構造図は以下のとおりです:
tabbar/ ─
tabbar
til - tabitem
└ - icon/
っていいます ─ ome
っていつ ─ — Logs ───Setting
アイコンの実装
About: { xml: `<svg width="48" height="48" viewBox="0 0 1024 1024"> <path d="M507.577907 23.272727C240.142852..."/> </svg>` }, Home: { xml: `<svg width="48" height="48" viewBox="0 0 1024 1024"> <path d="M949.082218 519.343245 508.704442..."/> </svg>` }, Logs: { xml: `<svg width="48" height="48" viewBox="0 0 1024 1024"> <path d="M576 125.344l32 0 0 64-32 0 0-64Z..."/> </svg>` }, Setting: { xml: `<svg width="48" height="48" viewBox="0 0 1024 1024"> <path d="M512 336.664c-96.68 0-175.336 78...."/> </svg>` }これらのアイコンは仮想ディレクトリ/アイコンの下にあることに注意してください。つまり、次のようにインポートする必要があります:
xmlplus("ui", function (xp, $_, t) { $_().imports({Tabbar: {... }, TabItem: {...}}); $_("icon").imports({--这里包含了四个图标组件--}); });次に、アイコン コンポーネント Icon を実装します。ここでのアイコン コンポーネントは上記とは異なります。入力されたアイコン タイプに基づいて、さまざまなアイコンがインスタンス化されます。この設計では、同じコードの一部を再利用し、冗長性を回避できます。
Icon: { css: "#icon { width: 1.5em; height: 1.5em; display: inline-block; }", opt: { icon: "about" }, xml: `<span id="icon"/>`, fun: function (sys, items, opts) { sys.icon.replace("icon/" + opts.icon).addClass("#icon"); } }このコンポーネントのfunction項目は、入力アイコンタイプに基づいてアイコンコンポーネントを作成し、既存のspan要素objectを置き換えます。置換後にスタイルを再度追加する必要があることに注意してください。
サブ項目の実装
内側から外側への原則に従い、次にタブコンポーネントのサブ項目TabItemを実装します。このコンポーネントの場合、コンポーネントのマッピング項目で同じ名前の 属性マッピングを実行し、 id 属性値を内部アイコン コンポーネントの icon 属性にマッピングする必要があります。
TabItem: { css: "这里是样式项部分,为便于组件整体展示,略去...", map: {"attrs": { icon: "id->icon" } }, xml: `<a id="tabitem"> <Icon id="icon"/> <span id="label">首页</span> </a>`, fun: function (sys, items, opts) { sys.label.text(opts.label); function select() { sys.tabitem.addClass("#primary"); } function unselect() { sys.tabitem.removeClass("#primary"); } return { select: select, unselect: unselect }; } }
このコンポーネントは、オプションを切り替えるときに選択された状態と選択されていない状態を切り替えるためのインターフェイス
を提供します。タブコンテナで使用します。
タブの実装
最後に、タブコンポーネントTabbarの実装を見てみましょう。このコンポーネントは、ユーザーがタブに触れたときに イベント
をリッスンします。リスナー内で主に 2 つのことを行います。1 つはタブの状態の切り替えを維持すること、もう 1 つはタブが切り替えられたときに状態変更イベントを送出することです。Tabbar: { css: "这里是样式项部分,为便于组件整体展示,略去...", xml: `<nav id="tabbar"/>`, fun: function (sys, items, opts) { var sel = this.first(); this.on("touchend", "./*[@id]", function (e) { sel.value().unselect(); (sel = this).value().select(); this.trigger("switch", this.toString()); }); if (sel) sel.value().select(); } }この時点で、タブ コンポーネントが完成しました。特定のアプリケーションを見てみましょう:
xmlplus("example", function (xp, $_, t) { $_().imports({ Index: { xml: `<Footer id='footer'/>`, fun: function (sys, items, opts) { this.on("switch", (e, target) => console.log(target)); } }, Footer: { xml: `<Tabbar id="footer"> <TabItem id="home" label="首页"/> <TabItem id="setting" label="设置"/> <TabItem id="logs" label="日志"/> <TabItem id="about" label="关于"/> </Tabbar>` } }); });コンポーネント Index では、タブからの切り替えイベントをリッスンして、対応する操作を実行できます。たとえば、後で紹介するviewstackコンポーネントを使用して、ページ間の切り替え操作を実行します。 この一連の記事は、xmlplus フレームワークに基づいています。 xmlplus についてあまり詳しくない場合は、www.xmlplus.cn にアクセスしてください。詳細な入門ドキュメントはここから入手できます。 【関連おすすめ】
1. 無料のjsオンラインビデオチュートリアル
2. JavaScript中国語リファレンスマニュアル
3. php.cn Dugu Jiijian (3) - JavaScriptビデオチュートリアル
🎜以上がJavaScript フレームワーク (xmlplus) コンポーネントの紹介 (5) タブバーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。