【JavaScript】从事件驱动到数据驱动
批处理
在多年以前,计算机程序通常是以批处理的模式运行。所谓批处理,就是开发者事先写好一些代码,再将这些代码一次运行。这种处理方式有点类似于通过HTML代码直接编写的网页。浏览器只是将HTML代码逐行解析,并显示在浏览器窗口。
后来,在批处理模式中,开发者可以加入一些特定的代码,在程序批处理期间,可以停下来等待用户输入一些信息,并根据用户输入的信息来判断和执行某个程序分支,这就使程序有了初步的交互性。
随着鼠标、触摸屏等设备的出现,批处理时代就逐渐远去,取而代之的是事件驱动的时代。当然,批处理也还能使用,只是使用的范围和频率比事件驱动要少得多。以鼠标为例,在事件驱动中,用户可以使用鼠标单击等方式进行操作,程序则根据鼠标指针的位置以及单击的方式进行响应。JavaScript使用的就是这种事件驱动的程序设计方式。
事件驱动
JS是事件驱动(Event Driver)的编程语言。Dom元素上的事件绑定是用来驱动业务逻辑的主要手段。JS中的事件流分为两种:1.事件冒泡,2.事件捕获。事件冒泡个人的简单理解就是从确定到不确定,从小的元素到最后的document,事件捕获则恰巧相反,它是从不确定到确定,从大到小。
事件在实际的业务开发里面十分的重要,它不仅仅是业务逻辑的推动者也是与对象交互的入口。每个事件都会有一个event对象,对象里面包含了各种你所想得到的信息,一般来说我们实际里面需要的是绑定事件的这个dom元素本身,此时通过e.target就可以得到触发事件的元素本身了。
在实际开发里面,我们将会用两种事件绑定的形式,一是事件的绑定,它会直接绑定到具体的元素,只有这个元素的事件被触发的时候,事件才会进行,具体的代码如下(jquery):
$('#id').click(function(){alert("hello");
});
这段代码为一个id为id的dom元素绑定了一个click事件,当dom元素被点击的事件,将会触发里面的方法弹出一个内容为“hello”的弹出框。这种普通添加事件到具体的元素,当元素在页面上是唯一不变,或者一直存在的时候是可以用的,但是如果一个元素的动态生成的,同时又有多个,那么普通添加事件就不可以,因为最下面的事件会覆盖上面的事件。因此我们此时需要的是事件绑定方式添加事件:
$('#id').on('click', '.class', function(){alert("hello");
});
个人感觉这种方式的好处就是直观,页面做任何改变全交由JS处理,先干什么后干什么都由自己一手代码操控全场。
但是,大型项目里,代码编写的成本和维护的成本都很高。对代码规范的要求高,对抽象的要求高,尤其是抽象程度,全赖个人编程水平,抽象程度低的话,冗长的代码根本不想多看一眼。这大概就是为啥项目里有一个代码写的烂的人在,代码就会越来越烂的原因。
数据驱动
数据驱动应该是从flux/redux + react这种模式开始流行的。
数据驱动的前提是事先将DOM与数据绑定,像vue这种就是依赖defineProperties, setter, getter将一个vue对象与一个DOM节点模板关联起来,这个DOM节点里所有子节点、所有节点属性,全都可以和vue对象中的data绑定,做到data中某个属性值变化时,相应DOM节点中对应的某个属性就变化。
如果需求简单还比较好解决,每个模块中自己解决自己的逻辑,解耦的非常清晰。父子之间的关系也非常明确。但如果需求分析如下图:
可见,对于复杂的交互,或者模块间关系复杂时,这种依赖父子关系的通信,是一个很大的障碍。
但是我们怎么办,拒绝模块化开发吗?那样页面设计起来耦合度更大,更加不可维护。
首先一点,模块化开发是一个不可逆的趋势,然而在这种趋势下,解决模块化通信是一个非常重要的点。
看看上面那个例子如果加上数据驱动的设计思想。
重点在于,当交互逻辑不断增加时,这个关系链条依然不会增加,因为模块只和model里面对于的数据相关联。
当然,这种模式也无法去省略复杂的业务逻辑,只是业务逻辑全部都会聚集在model中。可以理解为页面上所有的操作都是对数据的操作。然后每个模块只需要监听关注的数据改变即可,这个监听关系就是图中唯一的一条关系线。
换一个理解,我们将直接的模块和模块直接的耦合关系全部转移到了数据中去体现。而数据的维护是远远比模块更好维护的。
【JavaScript】从事件驱动到数据驱动相关推荐
- Javascript的事件驱动
Javascript基于事件驱动 事件处理: 1.发生事件 2.启动事件处理程序(通过 事件处理器触发) 3.事件处理程序作出反应 事件的调用(都是通过 事件处理器 调用) 1.在HTML中调用 &l ...
- 【JS】JavaScript的事件驱动和处理
目录 事件 鼠标触发 键盘触发 页面触发 表单触发 事件驱动 事件处理程序调用方法 作为HTML标记的属性 作为对象的属性值 事件 用户和web页面交互产生的动作,包括:鼠标触发.键盘触发.页面触发. ...
- 浅谈前端的数据驱动和事件驱动
js,jq 事件驱动->vue,react 数据驱动 前端生态越来越大 思想也从事件驱动转为数据驱动 事件驱动 操作UI => 触发事件 => 响应处理 => 更新UI 数据驱 ...
- 事件驱动的javascript
首先来看看这样一个应用场景,网页上有个链接,比如说高级搜索,点击以后会出现一个搜索面板.由于面板里有很多搜索字段,而这些搜索字段又有很多数据,因此决定采用异步来加载该搜索面板.以jQuery为例,代码 ...
- 19个很有用的 JavaScript 库
流行的 JavaScript 库有jQuery,MooTools,Prototype,Dojo和YUI等,这些 JavaScript 库功能丰富,加上它们众多的插件,几乎能实现任何你需要的功能,然而需 ...
- Javascript社区是时候接受async/await语法了
由于Javascript是一个单线程语言,大量的API都是异步实现的.异步代码有一个很讨厌的问题,会传染.当你在一个函数中使用一个异步API时,你需要通过回调执行后续的逻辑,而当外层逻辑使用这个函数并 ...
- JavaScript的基础学习篇
在学习JavaScript之前,我们应该先认识一下什么是脚本语言(Scripting Language)? 脚本语言就是一种简单的程序.在运行之前不需要先进行编译,所有的代码都是在客户程序中直接被执行 ...
- github流程图_10月份Github上最热门的JavaScript开源项目
开源最前线(ID:OpenSourceTop) 猿妹整编 转载请注明来源作者 10 月份 GitHub 上最热门的JavaScript开源项目排行已经出炉啦,在本月的名单中,有开源书籍.有开源课程等, ...
- 互联网公司前端初级Javascript面试题
互联网公司前端初级Javascript面试题 1.JavaScript是一门什么样的语言,它有哪些特点?(简述javascript语言的特点) JavaScript是一种基于对象(Object)和事件 ...
最新文章
- LeetCode简单题之旋转字符串
- OpenCV DNN支持的对象检测模型
- MapReduce Java API-使用Partitioner实现输出到多个文件
- uva10891Game of sum
- 十天冲刺---Day8
- 利用Mybatis对数据库进行增删改查操作
- proxool mysql 8小时_java数据库连接池proxool介绍及mysql8小时断开连接问题的说明
- 同学聚会 主持词_我主持freeCodeCamp聚会的三年来的成功和失败
- Java 发展简史:初生遇低谷,崛起于互联网
- mac 下设置 sublime text2 的命令行快捷方式 subl
- Atitit WatchService 使用和不能监控抓取到的解决 原因是生成速度太快,但处理速度慢,导致许多event 忽视了.. How to solu??? asyn to process
- 【Excel】多元一次方程组求解计算器
- Android免费获取短信验证码
- 用指纹解锁数据!云盒子企业网盘,新增指纹认证功能
- Unity导入图片尺寸大小和压缩格式的问题
- eclipse neno中tomcat配置servers locations地址的文件
- 趣谈TCP三次握手连接
- 建立Baseline之repo,manifest
- 伴随我们长大的经典—写给从80后的一批人
- 2023年全国最新会计专业技术资格精选真题及答案8
热门文章
- 使用 Python 和 Bitly 缩短您的 URL
- android studio虚拟机图库不显示图片,照片显示图片解决办法
- Linux 5.19 迎来首个候选版本,Linus:多平台 Linux 内核“差不多完成了”
- <金屋藏书>app 技术支持
- 计算机课app开发,毕业设计(论文)-基于Android的《计算机网络基础》课程App的设计与开发.doc...
- homelede软路由设置方法_二级lede软路由设置方法,lede设置软路由网卡
- Domino版本、维护版本和补丁程序概念
- CAD机械零件平面绘制练习七、CAD镜像命令高阶绘图练习
- Android Wi-Fi Display(Miracast)介绍
- WPS 宣布将推出“WPS AI”