全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

xmlplus组件设计系列之选项卡(Tabbar)(5)

这一章将设计一个选项卡组件,选项卡组件在手持设备上用的比较多,下面是一个示意图:

选项卡组成

在具体实现之前,想像一下目标组件是如何使用的,对于设计会有莫大的帮助。通过观察,可以将选项卡组件分为容器部分和子项部分,正如下面的 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。

结构图

由于该组件比较简单,所以可以将三种子组件放置在同一层级。但请注意,我们还有四个图标组件,可以创建一个子级用于容纳它们。下面给出我们的组件结构图:

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

图标的实现

我们从最简单的开始,先看四个图标组件,图标组件主要通过封装 SVG 文本来实现,由于图标文本较长,所以这里仅截取每个图标文本的一段。

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

请注意,这些图标位于虚拟目录 /icon 之下,也就是你要像下面这样导入:

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

该组件的函数项根据输入的图标类型创建图标组件并替换已有的 span 元素对象。注意,替换完后需要重新添加样式。

子项的实现

按从内到外的原则,接下来实现选项卡组件的子项 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 的实现。该组件侦听了用户触击选项卡时的事件,在侦听器里主要做两件事:一是维持选项卡状态的切换;另一是派发一选项卡切换时的状态改变事件。

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 中,你可以侦听来自选项卡的切换事件来做相应的操作。比如结合后续我们介绍的视图栈组件做页面之间的切换操作。

本系列文章基于 xmlplus 框架。如果你对 xmlplus 没有多少了解,可以访问 www.xmlplus.cn。这里有详尽的入门文档可供参考。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# xmlplus  # 选项卡  # xmlplus组件设计系列之网格(DataGrid)(10)  # xmlplus组件设计系列之文本框(TextBox)(3)  # xmlplus组件设计系列之下拉刷新(PullRefresh)(6)  # xmlplus组件设计系列之路由(ViewStack)(7)  # xmlplus组件设计系列之分隔框(DividedBox)(8)  # xmlplus组件设计系列之树(Tree)(9)  # xmlplus组件设计系列之按钮(2)  # xmlplus组件设计系列之列表(4)  # xmlplus组件设计系列之图标(ICON)(1)  # 首页  # 你可以  # 结构图  # 来实现  # 是一个  # 会有  # 一是  # 来看看  # 你对  # 请注意  # 可供  # 来做  # 比较多  # 它会  # 于此  # 最简单  # 件事  # 较长  # 完后 


相关文章: ,巨量百应是干嘛的?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  如何通过山东自助建站平台快速注册域名?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  用v-html解决Vue.js渲染中html标签不被解析的问题  安徽网站建设与外贸建站服务专业定制方案  制作证书网站有哪些,全国城建培训中心证书查询官网?  常州自助建站费用包含哪些项目?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  建站之星如何保障用户数据免受黑客入侵?  建站主机如何安装配置?新手必看操作指南  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  临沂网站制作企业,临沂第三中学官方网站?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  北京企业网站设计制作公司,北京铁路集团官方网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  个人网站制作流程图片大全,个人网站如何注销?  ppt制作免费网站有哪些,ppt模板免费下载网站?  linux top下的 minerd 木马清除方法  简单实现Android文件上传  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  建站之星后台密码遗忘或太弱?如何重置与强化?  如何通过网站建站时间优化SEO与用户体验?  网站制作模板下载什么软件,ppt模板免费下载网站?  IOS倒计时设置UIButton标题title的抖动问题  岳西云建站教程与模板下载_一站式快速建站系统操作指南  西安专业网站制作公司有哪些,陕西省建行官方网站?  建站主机选哪家性价比最高?  如何快速使用云服务器搭建个人网站?  如何在阿里云服务器自主搭建网站?  网站制作话术技巧,网站推广做的好怎么话术?  实现虚拟支付需哪些建站技术支撑?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  建站之星后台密码遗忘?如何快速找回?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  香港网站服务器数量如何影响SEO优化效果?  黑客如何通过漏洞一步步攻陷网站服务器?  怎么将XML数据可视化 D3.js加载XML  建站之星logo尺寸如何设置最合适?  广州商城建站系统开发成本与周期如何控制?  图册素材网站设计制作软件,图册的导出方式有几种?  如何在建站宝盒中设置产品搜索功能?  如何在阿里云完成域名注册与建站?  建站三合一如何选?哪家性价比更高?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  ,sp开头的版面叫什么?  如何制作一个表白网站视频,关于勇敢表白的小标题? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。