1. 程式人生 > >【JavaScript】從事件驅動到資料驅動

【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事件驅動資料驅動

批處理   在多年以前,計算機程式通常是以批處理的模式執行。所謂批處理,就是開發者事先寫好一些程式碼,再將這些程式碼一次執行。這種處理方式有點類似於通過HTML程式碼直接編寫的網頁。瀏覽器只是將HTM

原理零編寫ILI9341驅動全過程(基於Arduino)

最近在淘寶入手了一塊ILI9341彩色螢幕,支援320x240解析度。之前一直很好奇這類微控制器驅動的彩色螢幕的原理,就打算自己寫一個驅動,從電流層面操控ILI9341螢幕。話不多說,我們開始吧( ̄▽ ̄)~* 1.ILI9341晶片和ILI9341驅動板 首先這裡要明確兩個概念,ILI9341晶片和ILI93

JavaScript事件支持先發布後訂閱

class 問題 想要 png trigger 很快 9.png area ++ 之前寫過一個的事件管理器,就是普通的先訂閱後發布模式。但實際場景中我們需要做到後訂閱的也能收到發布的消息。比如我們關註微信公眾號,還是能看到歷史消息的。類似於qq離線消息,我先發給你,你登錄了

JavaScript未來事件的處理

author:咔咔 wechat:fangkangfk   對於後端來說,這個知識點估計有點生   像我們後端最常使用的就是列表進行分頁,然後進行js組裝資料,在這個時候最容易發生的事就是點選事件失效。這就是因為元素都是js動態生成的,所有需要使用未來事件

JavaScriptajax請求的資料返回時間戳使用js處理方案

author:咔咔 wechat:fangkangfk   方法: function formatDate(now) {   var year = now.getFullYear(),   month = now.getMonth() + 1,   

ArchitectureEDA事件驅動架構

轉自: http://www.jdon.com/eda.html 事件代表過去發生的事件,事件既是技術架構概念,也是業務概念。以事件為驅動的程式設計模型稱為事件驅動架構EDA。   EDA是一種以事件為媒介,實現元件或服務之間最大鬆耦合的方式。傳統面向介面程式設計是

利用 selenium 的 webdrive 驅動 headless chrome

edr 使用 fin fire logs ble user () 穩定性 1.參考 使用 headless chrome進行測試 2.概念 Headless模式解決了什麽問題: 自動化工具例如 selenium 利用有頭瀏覽器進行測試,面臨效率和穩定性的影響,所以出現了 H

javascript異步編年史,“純回調”到Promise

條件 one org 場景 存在 gofunc ges 語句 += 異步和分塊——程序的分塊執行 一開始學習javascript的時候, 我對異步的概念一臉懵逼, 因為當時百度了很多文章,但很多各種文章不負責任的把籠統的描述混雜在一起,讓我對

分享iTOP-iMX6UL開發板驅動看門狗 watchdog 以及 Linux-c 測試例程

eabi abi 例如 ext ora dev 格式 oar href iTOP-iMX6UL開發板看門狗測試例程,iTOP-iMX6UL 開發板的看門狗驅動默認已經配置,可以直接使用測試例程。 版本 V1.1:1、格式修改;2、例程修改完善,其中增加餵狗代碼。1 看

JavaScript常用的資料型別的處理方式

寫這篇文章的目的,是在學習過程中反覆查詢如何對這三種資料型別進行轉換的方法,所以乾脆總結在一起。   一、字串 0.includes:string.includes(),查詢當前string中是否包含某個字串,有返回true,沒有返回false 1.indexOf:string.indexO

javaScript資料型別

前言 上一篇文章已經介紹了javaScript是一種弱型別的語言,既然已經很弱了,所以它的型別上還是每個人都有些不同的看法的,具體它的資料型別是怎麼一回事,小編對此也有一個簡單的分類!個人感覺還是很清晰的! 1、思維導圖 因為js是嚴格區分大小寫的,這裡有人可能有人會問

JavaScript如何使用正則拆分複雜資料

前言:經常在技術群交流群遇到不會用正則拆分資料的網友在問,類似"2018-08-08","2018年08月08日","555<=ARPU<777"的複雜資料要怎麼去拆分,獲取到需要的部分。該

JavaScript使用ajax請求,進行html的資料組裝

author:咔咔 wechat:fangkangfk   這裡放一個組裝資料的案例,不會的可以參考一下 $.ajax({ type:"post", url:"{url(Banner/index)}",//對應contro

javascriptDOM模擬事件 和 自定義事件

事件,就是網頁中某一個特別值得關注的瞬間。 事件經常由使用者操作或通過其他瀏覽器功能來觸發。 但是也可以使用Javascript在任意時刻觸發特定的事件,這個時候的事件和瀏覽器建立的事件一樣。 也就是說這些事件還是有冒泡等屬性,而且瀏覽器也會響應該事件去執行相應的事件處理程式。 我們來跑一

javascript關於react的Virtual DOM 與資料更新

一,關於Virtual DOM         真實的頁面對應一個DOM樹,傳統的互動就是 DOM樹 觸發事件 -> 然後業務處理 ->操縱dom樹。操作DOM效能消耗大,且繁瑣,維護成本高。 &nb

JavaScript將方法物件中解耦

在專案中我一直做的一件事情就是把方法從其物件中解耦。 map 、 filter 以及 reduce 並非是全部,但是它們肯定是首先獲得自由的。 解耦方法可以讓方法擺脫父物件所施加的限制,同時在表示程式碼的方式上給了我們更多的自由。 那麼這到底是啥玩意呢? 為簡便起見

JavaScriptjquery右鍵點選事件和js禁用右鍵事件程式碼

jQuery滑鼠點選事件函式//jQuery滑鼠左擊、右擊和中擊事件 $('div').mousedown(function(e){ if(e.which == 3){ alert(

ZYNQ_LINUX如何把自己的驅動編譯進核心或模組(Kconfig和Makefile

linux驅動編寫(Kconfig檔案和Makefile檔案) feixiaoxing 2013年09月08日 17:12 5502 【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】      在linux編寫驅動的過程中,有兩個檔案是我們必須

Mapreduce程式碼上解決Output directory already exists錯誤,避免每次除錯都要手動刪除輸出資料

Mapreduce除錯很蛋疼的,它不會覆蓋上一次輸出的結果,如果發現輸出資料夾已經存在,比如我的除錯輸出資料夾是hdfs://192.168.230.129:9000/output,它會直接給你報如下錯誤: Exception in thread "main" org.ap

javascript非同步事件怎麼理解js是單執行緒的,但又可以實現非同步程式設計

js的非同步事件通常包括以下幾類: 網路請求:ajax請求,服務端響應(隨時發生) 計時器:setTimeOut,setTimeInterval(定時發生) 使用者事件:滑鼠,鍵盤,控制元件(隨時發生) 瀏覽器事件:頁面載入完畢,頁面載入失敗(隨時發生)