最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

xmlplus組件設(shè)計(jì)系列之選項(xiàng)卡(Tabbar)(5)

 更新時(shí)間:2017年05月03日 09:28:17   作者:qudou  
xmlplus 是一個(gè)JavaScript框架,用于快速開(kāi)發(fā)前后端項(xiàng)目。這篇文章主要介紹了xmlplus組件設(shè)計(jì)系列之選項(xiàng)卡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

這一章將設(shè)計(jì)一個(gè)選項(xiàng)卡組件,選項(xiàng)卡組件在手持設(shè)備上用的比較多,下面是一個(gè)示意圖:

選項(xiàng)卡組成

在具體實(shí)現(xiàn)之前,想像一下目標(biāo)組件是如何使用的,對(duì)于設(shè)計(jì)會(huì)有莫大的幫助。通過(guò)觀察,可以將選項(xiàng)卡組件分為容器部分和子項(xiàng)部分,正如下面的 XML 結(jié)構(gòu)所展示的。

<Tabbar id="tabbar">
  <TabItem id="home" label="首頁(yè)"/>
  <TabItem id="setting" label="設(shè)置"/>
  <TabItem id="logs" label="日志"/>
  <TabItem id="about" label="關(guān)于"/>
</Tabbar>


現(xiàn)在我們把目光切換到選項(xiàng)卡組件的子項(xiàng)部分,來(lái)看看子項(xiàng)部分是如何分解的。通過(guò)示意圖,你可以發(fā)現(xiàn)子項(xiàng)部分可以分解為子項(xiàng)容器以及包含一個(gè)圖標(biāo)和一個(gè)文本的子級(jí)部分。

<a id="tabitem">
  <Icon id="icon"/>
  <span id="label">首頁(yè)</span>
</a>

所以,現(xiàn)在我們的目標(biāo)已經(jīng)很明確了,主要設(shè)計(jì)三個(gè)組件:圖標(biāo)組件 Icon、選項(xiàng)卡組件的子項(xiàng) TabItem 以及選項(xiàng)卡組件的容器 Tabbar。

結(jié)構(gòu)圖

由于該組件比較簡(jiǎn)單,所以可以將三種子組件放置在同一層級(jí)。但請(qǐng)注意,我們還有四個(gè)圖標(biāo)組件,可以創(chuàng)建一個(gè)子級(jí)用于容納它們。下面給出我們的組件結(jié)構(gòu)圖:

Tabbar/
├── Tabbar
├── TabItem
└── Icon/
     ├── About
     ├── Home
     ├── Logs
     └── Setting

圖標(biāo)的實(shí)現(xiàn)

我們從最簡(jiǎn)單的開(kāi)始,先看四個(gè)圖標(biāo)組件,圖標(biāo)組件主要通過(guò)封裝 SVG 文本來(lái)實(shí)現(xiàn),由于圖標(biāo)文本較長(zhǎng),所以這里僅截取每個(gè)圖標(biāo)文本的一段。

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>`
}

請(qǐng)注意,這些圖標(biāo)位于虛擬目錄 /icon 之下,也就是你要像下面這樣導(dǎo)入:

xmlplus("ui", function (xp, $_, t) {
  $_().imports({Tabbar: {... }, TabItem: {...}});

  $_("icon").imports({--這里包含了四個(gè)圖標(biāo)組件--});
});

下面來(lái)實(shí)現(xiàn)圖標(biāo)組件 Icon,這里的圖標(biāo)組件與上面是不同的,它會(huì)根據(jù)輸入的圖標(biāo)類型實(shí)例化不同的圖標(biāo)。這樣設(shè)計(jì)可以復(fù)用部分相同的代碼,避免冗余。

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");
  }
}

該組件的函數(shù)項(xiàng)根據(jù)輸入的圖標(biāo)類型創(chuàng)建圖標(biāo)組件并替換已有的 span 元素對(duì)象。注意,替換完后需要重新添加樣式。

子項(xiàng)的實(shí)現(xiàn)

按從內(nèi)到外的原則,接下來(lái)實(shí)現(xiàn)選項(xiàng)卡組件的子項(xiàng) TabItem。對(duì)于此組件,需要在組件的映射項(xiàng)中做一次異名的屬性映射,把 id 屬性值映射給內(nèi)部的圖標(biāo)組件的 icon 屬性。

TabItem: {
  css: "這里是樣式項(xiàng)部分,為便于組件整體展示,略去...",
  map: {"attrs": { icon: "id->icon" } },
  xml: `<a id="tabitem">
       <Icon id="icon"/>
       <span id="label">首頁(yè)</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 };
  }
}

此組件提供了用于選項(xiàng)切換時(shí)選中與非選中狀態(tài)之間切換的接口。以供選項(xiàng)卡容器使用。

選項(xiàng)卡的實(shí)現(xiàn)

最后來(lái)看下選項(xiàng)卡組件 Tabbar 的實(shí)現(xiàn)。該組件偵聽(tīng)了用戶觸擊選項(xiàng)卡時(shí)的事件,在偵聽(tīng)器里主要做兩件事:一是維持選項(xiàng)卡狀態(tài)的切換;另一是派發(fā)一選項(xiàng)卡切換時(shí)的狀態(tài)改變事件。

Tabbar: {
  css: "這里是樣式項(xiàng)部分,為便于組件整體展示,略去...",
  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();
  }
}

至此,一個(gè)選項(xiàng)卡組件算是完成了,下面來(lái)看下具體的一個(gè)應(yīng)用:

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="首頁(yè)"/>
         <TabItem id="setting" label="設(shè)置"/>
         <TabItem id="logs" label="日志"/>
         <TabItem id="about" label="關(guān)于"/>
       </Tabbar>`
  }
  });
});


在組件 Index 中,你可以偵聽(tīng)來(lái)自選項(xiàng)卡的切換事件來(lái)做相應(yīng)的操作。比如結(jié)合后續(xù)我們介紹的視圖棧組件做頁(yè)面之間的切換操作。

本系列文章基于 xmlplus 框架。如果你對(duì) xmlplus 沒(méi)有多少了解,可以訪問(wèn) www.xmlplus.cn。這里有詳盡的入門文檔可供參考。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

图们市| 柞水县| 江油市| 湖州市| 荃湾区| 香格里拉县| 山阴县| 庄河市| 安化县| 确山县| 临沂市| 辽宁省| 和林格尔县| 琼海市| 枞阳县| 梅河口市| 宁城县| 新乐市| 凯里市| 定南县| 怀安县| 贵州省| 朝阳县| 青神县| 青田县| 石景山区| 巫溪县| 唐海县| 南溪县| 兴仁县| 津南区| 彭泽县| 萨嘎县| 福安市| 霸州市| 磐安县| 普兰县| 太谷县| 大田县| 阳朔县| 腾冲县|