xmlplus组件设计系列之按钮(2)


Posted in Javascript onApril 26, 2017

除了图标以外,按钮也许是最简单的组件了,现在来看看如何定义按钮组件。

使用原生按钮组件

在 xmlplus 中,HTML 元素也以组件的方式存在。所以,你可以直接通过使用 button 标签或者 input 标签来使用按钮组件。如下示例所示:

Example: {
  xml: "<div id='example'>\
       <button>Default</button>\
       <input type='submit'>Primary</input>\
     </div>"
}

虽然原生按钮外观不那么吸引人,但原生按钮未经特殊包装,所以渲染起来最快,执行效率最高。

使用 Bootstrap 样式的按钮

如果你的项目在视觉上没有特别要求的话。使用 Bootstrap 样式来定义按钮组件是一个好主意。按传统方式使用 Bootstrap 按扭,你需要像下面这样使用。

<button type="button" class="btn btn-default">Default</button>
<button type="button" class="btn btn-primary">Primary</button>
<button type="button" class="btn btn-success">Success</button>

请认真观察,你是不是觉得它给你的比你要求的要多。你不但发现了好多的 type=button,还发现了好多的 btn。现在下面给出一个组件,它基于 Bootstrap 样式,但它明显地简化了按钮的使用方式。

Button: {
  xml: "<button type='button' class='btn'/>",
  fun: function (sys, items, opts) {
    this.addClass("btn-" + opts.type);
  }
}

此按钮组件封装了原始按钮需要重复书写的内容,在使用时,仅需提供 type 属性即可指明目标按钮,使用起来更为便捷。下面给出的是新按钮组件的使用方式。

<Button type='default'>Default</Button>
<Button type='primary'>Primary</Button>
<Button type='success'>Success</Button>

带有图标的按钮

按钮上除了文字外,还可以附带图标。合适的图标可以使按扭的使用意图更加生动直观。这里以 EasyUI 的图标按钮为例来说明如何封装并使用图标按钮。我们首先来看看,EasyUI 图标按钮的原始使用方式。

<div style="padding:5px 0;">
  <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="easyui-linkbutton" data-options="iconCls:'icon-add'">Add</a>
  <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="easyui-linkbutton" data-options="iconCls:'icon-remove'">Remove</a>
  <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="easyui-linkbutton" data-options="iconCls:'icon-save'">Save</a>
</div>

与上一节对 Bootstrap 按钮的封装类似,通过观察提炼出重复出现的部分,将变化的部分以接口形式展现。上面的按钮仅图标类型名和文本是可变的,所以我们可以做出如下的设计:

Button: {
  xml: "<a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="easyui-linkbutton"/>",
  fun: function (sys, items, opts) {
    this.attr("data-options" + "iconCls:'icon-" + opts.type);
  }
}

下面是新图标的使用方式,它明显比原始的使用方式简洁多了。

<div style="padding:5px 0;">
  <Button type='add'>Add</Button>
  <Button type='remove'>Reomve</Button>
  <Button type='save'>Save</Button>
  <Button type='cut'>Cut</Button>
</div>

自定义你的按钮组件

使用类似 Bootstrap, EasyUI 等开源框架,可以避免重造轮子。然而,当这些开源项目无法满足你的需求时,你就需要自己动手了。

为简单起见,现在假定上述 Bootstrap 框架并不存在,那么如何设计一套上述的按钮?这样的实践是非常有意义的,它有助于你举一反三。

现在让我们重新对上面的按钮组件作观察。你会发现,Bootstrap 设计了一些可以组合的样式类,其中 btn 是每一个按钮都需要的,另外像 btn-default、btn-primary 等等都根据需要与 btn 形成组合样式类。好了,根据这个思路,我们就可以设计出如下的组件框架。

Button: {
  css: "#btn { 这里是按钮基本的样式 }\
     #default { 这里是default样式 }\
     #primary { 这里是primary样式 }",
  xml: "<button type='button'/>",
  fun: function (sys, items, opts) {
    this.addClass("#btn #" + opts.type, this);
  }
}

上述的设计思路与前面直接使用 Bootstrap 样式定义按钮不同点在于,前者已经为你定义好了各个全局的样式类,你只需要直接引用就可以了。而此处你需要在按扭组件内部自行定义相关样式类。从封装的角度看,后者的内聚性要强于前者,因为它并不暴露全局类名。下面是该组件的使用示例。

Example: {
  xml: "<div id='example'>\
       <Button type='default'>Default</Button>\
       <Button type='primary'>Primary</Button>\
       <Button type='success'>Success</Button>\
     </div>"
}

注意,为了简化起见,这里的自定义按钮组件略去了 hover、active 样式,所以与 Bootstrap 按钮有些不一样。

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

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

Javascript 相关文章推荐
js或者jquery判断图片是否加载完成实现代码
Mar 20 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
javascript数组去重的方法汇总
Apr 14 Javascript
javascript中setAttribute()函数使用方法及兼容性
Jul 19 Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
Aug 18 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
Aug 29 Javascript
javascript防篡改对象实例详解
Apr 10 Javascript
React-router中结合webpack实现按需加载实例
May 25 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 Javascript
Vue中watch、computed、updated三者的区别及用法
Jul 27 Javascript
基于ajax实现上传图片代码示例解析
Dec 03 Javascript
xmlplus组件设计系列之列表(4)
Apr 26 #Javascript
JS实现数组按升序及降序排列的方法
Apr 26 #Javascript
详解AngularJs ui-router 路由的简单介绍
Apr 26 #Javascript
JS ES6多行字符串与连接字符串的表示方法
Apr 26 #Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
Apr 26 #Javascript
Vue.js实现文章评论和回复评论功能
May 30 #Javascript
详解node.js平台下Express的session与cookie模块包的配置
Apr 26 #Javascript
You might like
PHP中的日期及时间
2006/11/23 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python中pip的安装与使用教程
2018/08/10 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
Django RBAC权限管理设计过程详解
2019/08/06 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
高级护理实习生自荐信
2013/09/28 职场文书
陈欧广告词
2014/03/14 职场文书
信息工作经验交流材料
2014/05/28 职场文书
2014年质量工作总结
2014/11/22 职场文书
Javascript webpack动态import
2022/04/19 Javascript