全网整合营销服务商

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

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

xmlplus组件设计系列之路由(ViewStack)(7)

在浏览器端,对路由的理解一般是根据不同的 URL 完成页面的切换。在服务器端,则是根据不同的 URL 请求回馈相关的页面。在本章,我们广义的组件路由的定义:根据接收到的不同命令,组件对象呈现出不同的子级页面。在这里将介绍与路由相关的一个组件,即视图栈 ViewStack。

视图栈初步

该组件在《文档》部分的最后一个章节《延迟实例化》已经出现过了。这里将对一些细节部分进行解读。下面再次给出该组件的源码。

ViewStack: { 
 xml: "<div id='viewstack'/>",
 fun: function (sys, items, opts) {
  var args, children = this.children(),
   table = children.call("hide").hash(),
   ptr = table[opts.index] || children[0];
  if (ptr) ptr = ptr.trigger("show").show();
  this.on("switch", function ( e, to ) {
   table = this.children().hash();
   if ( !table[to] || table[to] == ptr ) return;
   e.stopPropagation();
   args = [].slice.call(arguments).slice(2);
   ptr.trigger("hide", [to+''].concat(args)).hide();
   ptr = table[to].trigger("show", [ptr+''].concat(args)).show();
  });
  return Object.defineProperty({}, "selected", { get: function() {return ptr;}});
 }
}

从静态接口看,该组件允许提供静态参数 index,该参数是组件 ViewStack 某一儿子组件对象的名称,它用于指出哪一个子级组件会被最先呈现。请看下面的示例。

Example1: {
 xml: `<ViewStack index='bar'>
    <button id='foo'>foo</button>
    <button id='bar'>bar</button>
   </ViewStack>`
}

该示例中,ViewStack 包含一值为 bar 的属性 index,表明组件在实例化时,组件对象 bar 会最先呈现。而默认情况下,该组件的第一个子级组件会作为初始显示对象。再从动态接口看,该组件的函数项导出了一个名为 selected 的只读属性,该属性用于指示当前显示的子级组件对象。

通过事件切换目标组件对象

对于子级组件对象之间切换,该组件的函数项并未导出相关的接口,而是通过接收 switch 事件来完成切换。请看下面的示例。

Example2: {
 xml: "<ViewStack id='viewstack'>\
    <button id='foo'>foo</button>\
    <button id='bar'>bar</button>\
   </ViewStack>"
 fun: function (sys, items, opts) {
  sys.viewstack.on("click", "*", function(e) {
   var to = this + '' == "foo" ? "bar" : "foo",
    data = "hello, world";
   this.trigger("switch", [to, data]);
  });
  sys.foo.on("show", function (e, prev, data) {
   console.log("previous page is " + prev, "from data is " + data);
  });
  sys.bar.on("hide", function (e, prev, data) {
   console.log("previous page is " + prev, "from data is " + data);
  });
 }
}

对于该示例,当用户点击文字时,文字会在 foo 和 bar 之间切换,也即两个页面之间切换,切换是通过相应子级对象派发 switch 事件进行的。另外,组件 ViewStack 在切换页面时,还会对本次显示的页面派发事件 show,以及对本次隐藏的页面派发事件 hide,相关页面可以根据需要选择侦听与否。并且在侦听函数中,可以获知前一显示页面 ID 以及所传输的相关数据。

动态添加与移除子级对象

组件 ViewStack 支持动态添加与移除子级的组件对象,请看下面的一个示例。

Example3: {
 xml: "<ViewStack id='viewstack'>\
    <button id='foo'>foo</button>\
   </ViewStack>"
 fun: function (sys, items, opts) {
  var xml = "<button id='bar'>bar</button>";
  sys.viewstack.append(xml).trigger("switch", "bar");
 }
}

该示例中,函数项中动态添加了一个子级组件,并且通过派发事件 switch 将当前显示的视图切换为刚新添加的视图。

优化配置

组件 ViewStack 一般配合组件的延迟实例化功能使用。对于一些比较复杂的组件,这样有助于加快显示应用的初始页面。下面做简单示范。

Example4: {
 xml: `<ViewStack>
    <button id='foo'>foo</button>
    <button id='bar'>bar</button>
    <button id='alice'>alice</button>
   </ViewStack>`
 map: { defer: "bar alice" }
}

此示例中,ViewStack 子级包含三个子组件,其中组件对象 bar 和 alice 被设置为需要延迟实例化,只有当这两组件对象的 show 函数得到调用时,它们才真正开始实例化。

与 HTML5 History API 的配合使用

这里我们看看如何让组件 ViewStack 与 HTML5 History API 的配合使用。下面是一个简单的例子。

Example5: {
 xml: `<ViewStack id='example'>
    <button id='foo'>foo</button>
    <button id='bar'>bar</button>
    <button id='alice'>alice</button>
   </ViewStack>`,
 fun: function (sys, items, opts) {
  sys.example.on("show", "button", function (e, prev) {
   window.history.pushState({name: this + ""}, null, "/" + this);
  });
  window.addEventListener("popstate", function(e) {
   sys.example.trigger("switch", e.state.name);
  });
 }
}

该示例的关键点在于,当视图栈组件对象的子级页面发生变更时,使用函数 pushState 记录下来;另外需要侦听浏览器的 popstate 事件,当用户点击「前进」、「后退」按钮时,完成相应页面的切换。这种技术非常适合在单页应用中完成无刷新跳转,可以给用户带来非常好的体验。

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

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


# xmlplus  # 组件  # 路由  # ViewStack  # xmlplus组件设计系列之网格(DataGrid)(10)  # xmlplus组件设计系列之分隔框(DividedBox)(8)  # xmlplus组件设计系列之树(Tree)(9)  # 值得分享和收藏的xmlplus组件学习教程  # 移除  # 是一个  # 文档  # 在这里  # 过了  # 则是  # 还会  # 会在  # 你对  # 将对  # 非常好  # 可供  # 跳转  # 呈现出  # 可以根据  # 设置为  # 来完成  # 值为  # 大家多多  # 也即 


相关文章: ,想在网上投简历,哪几个网站比较好?  微信推文制作网站有哪些,怎么做微信推文,急?  宝塔Windows建站如何避免显示默认IIS页面?  C#如何使用XPathNavigator高效查询XML  济南专业网站制作公司,济南信息工程学校怎么样?  如何挑选优质建站一级代理提升网站排名?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  名字制作网站免费,所有小说网站的名字?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何实现建站之星域名转发设置?  北京的网站制作公司有哪些,哪个视频网站最好?  如何快速搭建支持数据库操作的智能建站平台?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何在Windows虚拟主机上快速搭建网站?  Python如何创建带属性的XML节点  Bpmn 2.0的XML文件怎么画流程图  建站之星logo尺寸如何设置最合适?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  平台云上自助建站如何快速打造专业网站?  如何零基础开发自助建站系统?完整教程解析  如何配置WinSCP新建站点的密钥验证步骤?  建站主机数据库如何配置才能提升网站性能?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  建站主机SSH密钥生成步骤及常见问题解答?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  制作旅游网站html,怎样注册旅游网站?  建站之星在线版空间:自助建站+智能模板一键生成方案  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Swift中循环语句中的转移语句 break 和 continue  建站主机选哪种环境更利于SEO优化?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何选择服务器才能高效搭建专属网站?  公司网站制作价格怎么算,公司办个官网需要多少钱?  建站主机服务器选型指南与性能优化方案解析  如何在香港服务器上快速搭建免备案网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何用腾讯建站主机快速创建免费网站?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  建站主机选购指南与交易推荐:核心配置解析  建站之星×万网:智能建站系统+自助建站平台一键生成 

您的项目需求

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