刀耕火种

  1. 刀耕火种是新石器时代残留的农业经营方式。又称迁移农业,为原始生荒耕作制。
  1. var TodoApp = Nuclear.create({
  2. add: function (evt) {
  3. evt.preventDefault();
  4. var textBox = this.node.querySelector('input');
  5. this.option.items.push(textBox.value);
  6. },
  7. installed: function () {
  8. var form = this.node.querySelector('form');
  9. form.addEventListener('submit', this.add.bind(this), false);
  10. },
  11. render: function () {
  12. return '<div>\
  13. <h3>TODO</h3>\
  14. <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>\
  15. <form >\
  16. <input type="text" />\
  17. <button>Add #{{items.length}}</button>\
  18. </form>\
  19. </div>';
  20. }
  21. });
  22. new TodoApp( { items: [] },"#container");

这种书写方式依赖延续了jQuery时代的思维方式:

  • js里查找dom
  • js里绑定事件

在以前的文章里写过,如果不使用组件化编程,js里查找dom以及在js里绑定事件可能会带来如下问题:

  • 浪费带宽
  • 用户反馈无响应
  • 脚本错误
  • 页面短暂错乱

上面的书写方式粗暴、原始、落后,即:刀耕火种。

石器锄耕

  1. “石器锄耕”是奴隶社会时期的主要耕作方式,这一时期农业已经有了很大的发展。
  1. var TodoApp = Nuclear.create({
  2. onRefresh: function () {
  3. this.form.addEventListener("submit", function (evt) {
  4. evt.preventDefault();
  5. this.option.items.push(this.textBox.value);
  6. }.bind(this), false);
  7. },
  8. render: function () {
  9. return '<div>\
  10. <h3>TODO</h3>\
  11. <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>\
  12. <form nc-id="form" >\
  13. <input nc-id="textBox" type="text" />\
  14. <button>Add #{{items.length}}</button>\
  15. </form>\
  16. </div>';
  17. }
  18. },{
  19. diff:false
  20. });
  21. new TodoApp( { items: [] },"#container");

会发现,查找dom的代码已销声匿迹。直接标记nc-id,就自动挂载在this下。
值得注意的是,传入了第二参数关闭了DOM diff。关掉diff的结果就是,每次组件HTML会全部重新替换渲染,绑定的事件全部丢失,所以需要将绑定事件的代码写入onRefresh里,这样每次重新渲染都会再绑定一次。
比刀耕火种先进一点:石器锄耕。

直捣黄龙

  1. 黄龙:即黄龙府,辖地在今吉林一带,应该是指长春市农安县,为金人腹地。一直打到黄龙府。指捣毁敌人的巢穴。指杀敌取胜。
  1. var TodoApp = Nuclear.create({
  2. add: function (evt) {
  3. evt.preventDefault();
  4. this.option.items.push(this.textBox.value);
  5. },
  6. render: function () {
  7. return '<div>\
  8. <h3>TODO</h3>\
  9. <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>\
  10. <form onsubmit="add(event)" >\
  11. <input nc-id="textBox" type="text" />\
  12. <button>Add #{{items.length}}</button>\
  13. </form>\
  14. </div>';
  15. }
  16. });
  17. new TodoApp( { items: [] },"#container");

会发现,查找dom和绑定的代码同时销声匿迹!!

  • 需要使用input,直接标记nc-id为textBox,就可以this.textBox访问
  • 需要绑定事件,直接在HTML内声明事件和回调onsubmit="add(event)"

也可以通过add(event,this)拿到event和触发该事件的dom元素。

代码通俗简洁干净直接,目的直观明确。故:直捣黄龙。

子承父业

  1. 宋·释道原《景德传灯录·利山和尚》:“僧问:不历僧只获法身,请师直指。师云:子承父业。”
  1. var TodoList = Nuclear.create({
  2. render: function () {
  3. return '<ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>';
  4. }
  5. });
  6. var TodoApp = TodoList.create({
  7. add: function (evt) {
  8. evt.preventDefault();
  9. this.option.items.push(this.textBox.value);
  10. },
  11. render: function () {
  12. return '<div>\
  13. <h3>TODO</h3>'
  14. + this._super.render() +
  15. '<form onsubmit="add(event)" >\
  16. <input nc-id="textBox" type="text" />\
  17. <button>Add #{{items.length}}</button>\
  18. </form>\
  19. </div>';
  20. }
  21. });
  22. new TodoApp({ items: [] },"#container");

TodoApp不过是TodoList的炎黄子孙,故TodoApp可以通过this._super访问父辈。也可访问父辈任何方法。有人会说:“组合”优于“继承”的。一定要明白:OOP既能组合也能继承,是不冲突的。且看下面例子。

万夫一力

  1. 明·刘基 《郁离子·省敌》:“万夫一力,天下无敌。”
  1. var TodoList = Nuclear.create({
  2. render: function () {
  3. return '<ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>';
  4. }
  5. });
  6. var TodoApp = Nuclear.create({
  7. install: function () {
  8. this.todoList = new TodoList({ items: [] })
  9. },
  10. add: function (evt) {
  11. evt.preventDefault();
  12. this.todoList.option.items.push(this.textBox.value);
  13. this.refresh();
  14. },
  15. render: function () {
  16. return '<div>\
  17. <h3>TODO</h3>'
  18. + this.todoList.render()+
  19. '<form onsubmit="add(event)" >\
  20. <input nc-id="textBox" type="text" />\
  21. <button>Add #'+this.todoList.option.items.length+'</button>\
  22. </form>\
  23. </div>';
  24. }
  25. });
  26. new TodoApp( {},"#todo2Container");

前一个例子的继承,这个例子是组合。不能说你的框架是Class base就不能使用组合,这是天大的误解。而我依稀记得极限编程关于面向对象设计的推论是:优先使用对象组合,而不是类继承。作为框架的设计者,虽然会有一些约束,但是如果连组合和继承都不能共存,那就是设计的最大败笔。
使用Nuclear既能继承也能组合,关键看程序逻辑该怎么抽象和实现复杂度。

藕断丝连

  1. 唐·孟郊《去妇》诗:“妾心藕中丝;虽断犹牵连。”
  1. var TodoList = Nuclear.create({
  2. render: function () {
  3. return '<ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>';
  4. }
  5. });
  6. var TodoApp = Nuclear.create({
  7. install: function () {
  8. this.todoList = new TodoList(this.option)
  9. },
  10. add: function (evt) {
  11. evt.preventDefault();
  12. this.option.items.push(this.textBox.value);
  13. },
  14. render: function () {
  15. return '<div>\
  16. <h3>TODO</h3>'
  17. + this.todoList.render()+
  18. '<form onsubmit="add(event)" >\
  19. <input nc-id="textBox" type="text" />\
  20. <button>Add #{{items.length}}</button>\
  21. </form>\
  22. </div>';
  23. }
  24. });
  25. new TodoApp( { items: [] },"#container");

这个例子和上个例子的区别是:共用option。option的变更会自动更新依赖option的组件。

四海为家

  1. 《汉书·高帝记》:“且夫天子以四海为家。”
  1. var TodoApp = Nuclear.create({
  2. add: function (evt) {
  3. evt.preventDefault();
  4. this.option.items.push(this.textBox.value);
  5. },
  6. render: function () {
  7. return '<div>\
  8. <h3>TODO</h3>\
  9. <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>\
  10. <form onsubmit="add(event)" >\
  11. <input nc-id="textBox" type="text" />\
  12. <button>Add #{{items.length}}</button>\
  13. </form>\
  14. </div>';
  15. }
  16. });
  17. var todo= new TodoApp( { items: [] });
  18. todo.setNuclearContainer('#container');

且看上面的new TopApp没传第二个参数指定容器。后面使用setNuclearContainer指定容器。这个场景还是比较常见,创建游离态组件,后续根据需要指定容器。AlloyLever就是这么干的: https://github.com/AlloyTeam/AlloyLever/blob/master/src/js/main.js

如虎添翼

  1. 三国·蜀·诸葛亮《心书·兵机》:“将能执兵之权,操兵之势,而临群下,臂如猛虎加之羽翼,而翱翔四海。”
  1. var TodoApp = Nuclear.create({
  2. add: function (evt) {
  3. evt.preventDefault();
  4. this.option.items.push(this.textBox.value);
  5. },
  6. render: function () {
  7. return '<div>\
  8. <h3>TODO</h3>\
  9. <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>\
  10. <form onsubmit="add(event)" >\
  11. <input nc-id="textBox" type="text" />\
  12. <button>Add #{{items.length}}</button>\
  13. </form>\
  14. </div>';
  15. },
  16. style: function () {
  17. return 'h3 { color:red; }\
  18. button{ color:green;}';
  19. }
  20. });
  21. var todoApp = new TodoApp({ items: [] }, '#container');
  22. todoApp.option.items.push('Nuclear');
  23. todoApp.option.items.push('Hello World!');

style方法内的样式自会对自身生效,不会污染其他组件。可以操作对象实例option,option的变更会自动更新组件,属性设置>方法调用。
双向绑定的好处以前写过一篇文章专门介绍,从上面的例子也能可出:

  • 组件内部的代码更简洁
  • 组件外部的代码更简洁

壁垒森严

  1. 壁垒:古代军营四周的围墙;森严:整齐,严肃。原指军事戒备严密。现也用来比喻彼此界限划得很分明。
  1. <template id="myTemplate">
  2. <style scoped>
  3. h3 { color:red; }
  4. button{ color:green;}
  5. </style>
  6. <div>
  7. <div>
  8. <h3>TODO</h3>
  9. <ul>{{#items}}<li>{{.}}</li>{{/items}}</ul>
  10. <form onsubmit="add(event)">
  11. <input nc-id="textBox" type="text">
  12. <button>Add #{{items.length}}</button>
  13. </form>
  14. </div>
  15. </div>
  16. </template>
  17. <script>
  18. var TodoApp = Nuclear.create({
  19. install:function() {
  20. this.todoTpl = document.querySelector("#myTemplate").innerHTML;
  21. },
  22. add: function (evt) {
  23. evt.preventDefault();
  24. this.option.items.push(this.textBox.value);
  25. },
  26. render: function () {
  27. return this.todoTpl;
  28. }
  29. });
  30. new TodoApp({ items: [] }, "#todoListContainer");
  31. </script>

不用担心template标签的兼容性问题,Nuclear帮你处理好了。支持所有现代浏览器(包括IE9+)。
Nuclear也在js里进行了动态插入了template { display: none !important; }。但是js还没执行到且浏览器不兼容template的话,用户会看到一闪而过的模板原始代码。
所以为了避免IE9一闪而过的模板原始代码直接显示,建议在head中加入。

  1. <style>
  2. template {
  3. display: none !important;
  4. }
  5. </style>

如果你像手Q hybrid应用那样只需要兼容webkit的话,天生支持template,就不用加入上面的兼容样式。

鬼斧神工

  1. 《庄子·达生》:“梓庆削木为鐻,鐻成,见者惊忧鬼神。”
  1. var TodoApp = Nuclear.create({
  2. add: function (evt) {
  3. evt.preventDefault();
  4. this.option.items.push(this.textBox.value);
  5. },
  6. render: function () {
  7. return `<div>
  8. <h3>TODO</h3>
  9. <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>
  10. <form onsubmit="add(event)" >
  11. <input nc-id="textBox" type="text" />
  12. <button>Add #{{items.length}}</button>
  13. </form>
  14. </div>`;
  15. },
  16. style: function () {
  17. return `h3 { color:red; }
  18. button{ color:green;}`;
  19. }
  20. });

人剑合一

  1. 剑修者最高境界,人既是剑,剑既是人,剑随心发,人随剑杀
  1. var TodoApp = Nuclear.create({
  2. add: function (evt) {
  3. evt.preventDefault();
  4. this.option.items.push(this.textBox.value);
  5. },
  6. render: function () {
  7. return `<style scoped>
  8. h3 { color:red; }
  9. button{ color:green;}
  10. </style>
  11. <div>
  12. <h3>TODO</h3>
  13. <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>
  14. <form onsubmit="add(event)" >
  15. <input nc-id="textBox" type="text" />
  16. <button>Add #{{items.length}}</button>
  17. </form>
  18. </div>`;
  19. }
  20. });

Nuclear从出生,API简单稳定,几乎没怎么变动,内部是实现在不断的完善,API驱动非常重要,不能因为实现某些API困难而做任何妥协,比如让使用框架的着多传个参数、多调用一次方法,这都是设计的缺陷。

Nuclear就是不妥协的结果。因为简单的设计,所以可以有很多强大的玩法,待续...

广而告之

Nuclear Github: https://github.com/AlloyTeam/Nuclear

加入Nuclear,一起让组件化开发体验更加惬意、舒适..

基于Nuclear的Web组件-Todo的十一种写法的更多相关文章

  1. 基于JS实现回到页面顶部的五种写法(从实现到增强)

    这篇文章主要介绍了基于JS实现回到页面顶部的五种写法(从实现到增强)的相关资料,本文介绍的非常详细,实用性也非常高,非常具有参考借鉴价值,需要的朋友可以参考下   写法 [1]锚点 使用锚点链接是一种 ...

  2. 基于接口的 InvocationHandler 动态代理(换种写法)

    InvocationHandler is the interface implemented by the invocation handler of a proxy instance. Each p ...

  3. 基于继承的 MethodInterceptor 动态代理(换种写法)

    net.sf.cglib.proxy.Enhancer Generates dynamic subclasses to enable method interception. This class s ...

  4. 10.Web组件复用

    1.静态包含(一个指令) 在软件工程中构建可复用组件可极大的提高软件生产效率.增强系统的可维护性HTML标记对于一个web应用系统中的页面都是通用的,比如公司标志.版权声明.导航菜单JSP中引用的we ...

  5. Web组件的三种关联关系

    Web应用程序如此强大的原因之一是它们能彼此链接和聚合信息资源.Web组件之间存在三种关联关系: ●  请求转发 ●  URL重定向 ●  包含 存在以上关联关系的Web组件可以是JSP或Servle ...

  6. 漫谈Nuclear Web组件化入门篇

    目前来看,团队内部前端项目已全面实施组件化开发.组件化的好处太多,如:按需加载.可复用.易维护.可扩展.少挖坑.不改组件代码直接切成服务器端渲染(如Nuclear组件化可以做到,大家叫同构)... 怎 ...

  7. RSuite 一个基于 React.js 的 Web 组件库

    RSuite http://rsuite.github.io RSuite 是一个基于 React.js 开发的 Web 组件库,参考 Bootstrap 设计,提供其中常用组件,支持响应式布局. 我 ...

  8. Amaze UI 发布基于jQuery新版本v2.0.0之web组件

    首先Amaze Ui第一版时我收到邮件邀请去试用,去了官网看了下,是基于zepto.js的一个类似bootstrap的响应式框架,提到框架当然是好事,快速开发呗.这词2.0的弃用zepto.js改用j ...

  9. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

随机推荐

  1. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  2. windows下mongodb配置

    打开cmd(windows键+r输入cmd)命令行,进入D:\mongodb\bin目录(如图先输入d:进入d盘然后输入cd d:\mongodb\bin), 输入如下的命令启动mongodb服务: ...

  3. Struts2.5需要的最少jar文件

    以Struts2.5.2为例 从官网上下载“struts-2.5.2-min-lib.zip”,里面有7个jar文件: commons-fileupload-1.3.2.jarcommons-io-2 ...

  4. linux常用命令(3)mkdir命令

    mkdir命令1 命令格式:mkdir [选项]目录名2 命令功能:通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录.要创建文件夹或目录的用户必须对所创 ...

  5. 【腾讯Bugly干货分享】微信iOS SQLite源码优化实践

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57b58022433221be01499480 作者:张三华 前言 随着微信iO ...

  6. 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘

    本挖掘典型地运用了机器学习技术,例如聚类,分类,关联规则,和预测建模.这些技术揭示潜在内容中的意义和关系.文本发掘应用于诸如竞争情报,生命科学,客户呼声,媒体和出版,法律和税收,法律实施,情感分析和趋 ...

  7. ABP框架 - 多租户

    文档目录 本节内容: 什么是多租户 多部署 - 多数据库 单部署 - 多数据库 单部署 - 单数据库 单部署 - 混数据库 多部署 - 单/多/混 数据库 ABP中的多租户 启用多租户 宿主与租户 会 ...

  8. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

  9. python中的Ellipsis

    ...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...

  10. ECS Linux 服务器公钥秘钥SSH登录

    Ubuntu 14.04.1为例,设置步骤如下: 一. 生成密钥的公钥和私钥 # ssh-keygen -t rsa Generating public/private rsa key pair. E ...