摘要:我們將使用,這是一個現代,簡單,漂亮的框架,在內部使用并將響應式編程概念應用于前端編程。驅動程序采用從我們的應用程序發出數據的,它們返回另一個導致副作用的。我們將使用來呈現我們的應用程序。僅采用長度超過兩個字符的文本。
Rxjs 響應式編程-第一章:響應式
Rxjs 響應式編程-第二章:序列的深入研究
Rxjs 響應式編程-第三章: 構建并發程序
Rxjs 響應式編程-第四章 構建完整的Web應用程序
Rxjs 響應式編程-第五章 使用Schedulers管理時間
Rxjs 響應式編程-第六章 使用Cycle.js的響應式Web應用程序
隨著單頁應用程序的出現,網站突然被期望做更多,甚至與“原生”應用程序進行競爭。在嘗試更快地開發Web應用程序時,開發人員意識到特定領域是瓶頸,使Web應用程序不像其本地應用程序那樣快速和強大。
在Facebook React的帶領下,有幾個Web框架正在使用著新技術,以便在保持代碼簡單和聲明式的同時制作更快的Web應用程序。
在本章中,我們將介紹一些開發Web應用程序的新技術,例如Virtual DOM。 我們將使用Cycle.js,這是一個現代,簡單,漂亮的框架,在內部使用RxJS并將響應式編程概念應用于前端編程。
Cycle.jsCycle.js是RxJS之上的一個小框架,用于創建響應式用戶界面。 它提供了現代框架(如React)中的功能,例如虛擬DOM和單向數據流。
Cycle.js以反應方式設計,Cycle.js中的所有構建塊都是Observables,這給我們帶來了巨大的優勢。 它比其他框架更容易掌握,因為理解和記憶的概念要少得多。 例如,與狀態相關的所有操作都不在路徑中,封裝在稱為驅動程序的函數中,我們很少需要創建新的操作。
什么是虛擬DOM?安裝Cycle.js文檔對象模型(DOM)定義HTML文檔中元素的樹結構。 每個HTML元素都是DOM中的一個節點,每個節點都可以使用節點上的方法進行操作。
DOM最初是為了表示靜態文檔而創建的,而不是我們今天擁有的超級動態網站。 因此,當DOM樹中的元素經常更新時,它的設計并不具有良好的性能。 這就是為什么當我們對DOM進行更改時會出現性能損失。
虛擬DOM是用JavaScript的DOM的映射。 每次我們更改組件中的狀態時,我們都會為組件重新計算一個新的虛擬DOM樹,并將其與之前的樹進行比較。 如果存在差異,我們只會渲染這些差異。 這種方法非常快,因為比較JavaScript對象很快,我們只對“真正的”DOM進行絕對必要的更改。
這種方法意味著我們可以編寫代碼,就好像我們為每個更改生成了整個應用程序UI。 我們不必跟蹤DOM中的狀態。 在幕后,Cycle.js將檢查每次更新是否有任何不同,并負責有效地渲染我們的應用程序。
我們可以通過使用標記將它包含在HTML頁面中來使用Cycle.js,但這不是使用它的最佳方式,因為Cycle.js是以極其模塊化的方式設計的。 每個模塊都盡可能地自我依賴管理,并且包括幾個模塊。因為可以輕松加載大量重復代碼,從而導致不必要的下載和更長的啟動時間。
相反,我們將使用Node Package Manager,npm和Browserify為我們的最終腳本生成代碼。 首先,我們將創建一個項目將存在的新文件夾,并安裝我們的項目依賴項:
mkdir wikipedia-search && cd wikipedia-search npm install browserify npm install @cycle/core npm install @cycle/dom
第一個npm命令安裝Browserify,它允許我們為瀏覽器編寫代碼,就像它是Node.js應用程序一樣。 使用Browserify,我們可以使用Node.js的模塊加載器,它將明智地包含哪些依賴項,使代碼下載盡可能小。 接下來,我們安裝了cycle-core和cycle-dom,它們是Cycle.js的兩個基本模塊。
有了這個,我們可以創建一個名為index.js的文件,我們將編輯我們的應用程序,然后使用本地Browserify二進制文件將其編譯成一個名為bundle.js的文件:
touch index.js `npm bin`/browserify index.js --outfile bundle.js
上面的命令將遍歷我們的依賴樹并創建一個bundle.js文件,其中包含運行我們的應用程序所需的所有內容,包括我們在代碼中需要的任何依賴項。 我們可以在index.html中直接包含bundle.js:
cycle/index.html
我們的項目:維基百科搜索Wikipedia search
在本節中,我們將構建一個搜索Wikipedia作為用戶類型的應用程序。
RxJS已經使得檢索和處理遠程數據變得容易了,但是,正如第4章“構建完整的Web應用程序”中所看到的那樣,我們仍然需要跳過一些環節來使我們的DOM操作高效。
Cycle.js的目標之一是完全消除代碼中的DOM操作。 讓我們從一些基本的腳手架開始:
cycle/step1.js
var Cycle = require("@cycle/core"); ? var CycleDOM = require("@cycle/dom") var Rx = Cycle.Rx; ? function main(responses) { return { DOM: Rx.Observable.just(CycleDOM.h("span", "Hi there!")) }; } var drivers = { ? DOM: CycleDOM.makeDOMDriver("#container") }; ? Cycle.run(main, drivers);
這段代碼在屏幕上顯示文字hi!,但已經有相當多的事情發生了。 重要的部分是主要功能和驅動對象。 我們來看看這些步驟:
我們需要Cycle Core和Cycle DOM驅動程序。 我將在下一節中解釋Cycle.js驅動程序的內容。
主要功能始終是我們應用程序的入口點。 它返回一組Observable,一個用于應用程序中的每個驅動程序。 到目前為止,我們只使用一個驅動程序:DOM驅動程序。
DOM驅動程序的Observable發出一個虛擬樹,我們使用Cycle DOM庫中的h方法創建。 在這種情況下,我們只創建一個帶有“Hi there!”文本的span元素。 DOM驅動程序使用該虛擬樹并從中呈現頁面上的實際DOM。
我們創建一個DOM驅動程序,它將根據main函數構建DOM樹。 DOM樹將構建在我們作為參數傳遞的元素或選擇器中。 在這里傳的是#container。
Cycle.run將main函數與drivers對象連接起來,在兩者之間創建循環流。
Cycle.js驅動程序Cycle.js驅動程序是我們用來引起副作用的函數。在我們的程序中,我們應該以任何方式修改狀態。驅動程序采用從我們的應用程序發出數據的Observable,它們返回另一個導致副作用的Observable。
我們不會經常創建驅動程序 - 只有當我們需要副作用時,例如修改DOM,從其他接口讀取和寫入(例如,本地存儲)或發出請求。 在大多數應用程序中,我們只需要DOM驅動程序(呈現網頁)和HTTP驅動程序(我們可以使用它來發出HTTP請求)。 在這個例子中,我們將使用另一個JSONP驅動程序。
用戶界面我們需要頁面的實際內容,而不僅僅是span。 讓我們創建一個函數來創建代表我們頁面的虛擬樹:
cycle/index.js
function vtreeElements(results) { var h = CycleDOM.h; return h("div", [ h("h1", "Wikipedia Search "), h("input", {className: "search-field", attributes: {type: "text"}}), h("hr"), h("div", results.map(function(result) { return h("div", [ h("a", { href: WIKI_URL + result.title }, result.title) ]); })) ]); }
這個功能可能看起來有點奇怪,但不要驚慌。 它使用Virtual Hyperscript,一種用于創建虛擬DOM樹的特定于域的語言。 Virtual Hyperscript包含一個名為h的方法。 h以類似于HTML的方式聲明節點,但使用JavaScript語言。我們可以通過將額外的對象或數組作為參數傳遞給h來向元素添加屬性或將子元素附加到它們。生成的虛擬樹最終將呈現為真正的瀏覽器DOM。
vtreeElements獲取一組對象,結果,并返回一個虛擬樹,代表我們應用程序的簡單UI。 它呈現一個輸入字段和一個由結果中的對象組成的鏈接列表,最終將包含Wikipedia的搜索結果。 我們將使用vtreeElements來呈現我們的應用程序。
使用JSX我們可以使用JSX編寫我們的UI,而不是使用h函數,JSX是一種由Facebook發明的類似XML的語法擴展,它使得編寫虛擬DOM結構更容易,更易讀。 我們的vtreeElements函數看起來像這樣:
cycle/index.js
function vtreeElementsJSX(results) { results = results.map(function(result) { var link = WIKI_URL + result.title; return }); return; }Wikipedia Search
{results}
它看起來不是更好嗎?JSX看起來對開發人員來說比較熟悉,因為它類似于HTML,但是我們可以將它與JavaScript代碼一起編寫,并且我們可以將其視為JavaScript類型。 例如,注意我們如何迭代結果數組,我們直接返回一個
由于JSX是一種語法擴展,我們需要一個編譯器將其轉換為最終的JavaScript代碼(它看起來非常像我們上一節中基于h的代碼)。 我們將使用Babel。 Babel是一個編譯器,它將現代JavaScript轉換為可在任何地方運行的JavaScript。它還轉換了一些JavaScript擴展,例如JSX,也就是之前的用例。
如果要使用JSX,則需要安裝Babel并在編譯項目時使用它。 幸運的是,Babel有一個名為Babelify的Browserify適配器:
npm install babelify
在每個使用JSX的文件中,我們需要在文件頂部添加以下行:
/** @jsx hJSX */ var hJSX = CycleDOM.hJSX;
這告訴Babel使用Cycle.js的hJSX適配器來處理JSX,而不是使用默認的React。
現在,當我們想要編譯項目時,我們可以使用以下命令:
browserify index.js -t babelify --outfile bundle.js從用戶那里獲取搜索關鍵詞
我們需要一個函數來返回一個Observable of URL,它使用用戶輸入的搜索詞來查詢Wikipedia的API:
cycle/index.js
var MAIN_URL = "https://en.wikipedia.org"; var WIKI_URL = MAIN_URL + "/wiki/"; var API_URL = MAIN_URL + "/w/api.php?" + "action=query&list=search&format=json&srsearch="; function searchRequest(responses) { return responses.DOM.select(".search-field").events("input") .debounce(300) .map(function(e) { return e.target.value }) .filter(function(value) { return value.length > 2 }) .map(function(search) { return API_URL + search }); }
首先,我們聲明一些我們的應用程序將用于查詢Wikipedia的URL。 在函數searchRequest中,我們獲取包含應用程序中所有驅動程序的響應對象,并在DOM驅動程序中使用get方法。select(element).event(type)的行為與fromEvent類似:它采用DOM元素的選擇器和要監聽的事件類型,并返回發出事件的Observable。
這時,代碼的其余部分看起來應該非常熟悉,因為它包含通過我們常用的運算符轉換Observable值:
節流結果最多每300毫秒接收一個。
提取輸入框的值。
僅采用長度超過兩個字符的文本。
將最終值附加到Wikipedia的API URL。
太棒了! 到目前為止,我們有生成UI的功能和從該UI檢索用戶輸入的功能。我們現在需要添加將從維基百科獲取信息的功能。
修改我們的主要功能你可能已經在之前的代碼中注意到main函數接受了一個我們沒有使用的參數,responses。這些是來自run函數中的responses。驅動程序和main函數形成一個循環(因此框架的名稱):main的輸出是驅動程序的輸入,驅動程序的輸出是main的輸入。請記住,輸入和輸出始終是Observables。
我們使用JSONP查詢Wikipedia,就像我們在第2章中所做的那樣。我們使用JSONP而不是HTTP來更容易在本地計算機上運行此示例,因為使用HTTP從不同的域檢索數據會導致某些瀏覽器因為安全原因阻止這些請求。 在幾乎任何其他情況下,尤其是在生產代碼中,使用HTTP來檢索遠程數據。
無論如何,使用JSONP并不影響本章的要點。 Cycle有一個JSONP的實驗模塊,我們可以使用npm安裝它:
npm install @cycle/jsonp
然后我們在我們的應用中使用它,如下所示:
cycle/step2.js
var Cycle = require("@cycle/core"); var CycleDOM = require("@cycle/dom"); var CycleJSONP = require("@cycle/jsonp"); var Rx = Cycle.Rx; var h = CycleDOM.h; function searchRequest(responses) { return responses.DOM.select(".search-field").events("input") .debounce(300) .map(function(e) { return e.target.value }) .filter(function(value) { return value.length > 2 }) .map(function(search) { return API_URL + search }); } function vtreeElements(results) { return h("div", [ h("h1", "Wikipedia Search "), h("input", {className: "search-field", attributes: {type: "text"}}), h("hr"), h("div", results.map(function(result) { return h("div", [ h("a", { href: WIKI_URL + result.title }, result.title) ]); })) ]); } function main(responses) { return { DOM: Rx.Observable.just(CycleDOM.h("span", "Hey there!")), JSONP: searchRequest(responses) } } var drivers = { DOM: CycleDOM.makeDOMDriver("#container"), JSONP: CycleJSONP.makeJSONPDriver() }; Cycle.run(main, drivers);
我們希望將searchRequest的結果插入到JSONP方法中,這樣一旦用戶輸入搜索詞,我們就會用術語查詢Wikipedia。
為此,我們使用CycleJSONP.makeJSONPDriver創建一個新的JSONP,它將接收我們在main的返回對象中放置在屬性JSONP中的任何內容。在這之后,當我們在輸入框中引入搜索詞時,我們應該已經在查詢維基百科,但由于我們沒有將JSONP輸出連接到任何內容,我們在頁面上看不到任何更改。 讓我們改變一下:
cycle/step3.js
function main(responses) { var vtree$ = responses.JSONP .filter(function(res$) { return res$.request.indexOf(API_URL) === 0; }) .mergeAll() .pluck("query", "search") .startWith([]) .map(vtreeElements); return { DOM: vtree$, JSONP: searchRequest(responses) }; }
main通過其響應參數接收所有驅動程序的輸出。我們可以在respond.JSONP中獲取JSON調用的結果,這是我們應用程序中所有JSONP響應的Observable。完成后,我們可以轉換Observable以我們想要的形式獲取搜索結果:
esponses.JSONP會在應用程序中發出所有JSONP響應。 我們首先在其請求中過濾包含Wikipedia的API URL的內容,以確保我們正在處理相關的響應。
respond.JSONP是一個Observable of Observables。 對于每個響應,都有一個Observable。 在這一行中,我們將它們全部展平,因此我們從現在開始處理響應,而不是它們的Observables。
響應是JSON對象,我們感興趣的信息在query.search屬性中。 我們使用pluck運算符來提取它。
我們不知道我們是否會有任何結果,所以至少我們確保我們有一個空數組。
最后,我們將vtreeElements函數應用于維基百科的每個結果。 這將更新我們的UI。
注意變量名稱末尾的$符號。 在本章中,我采用了Cycle.js代碼中使用的命名約定,它將$添加到變量名稱,表示它是一個Observable。 我發現它可以更容易理解基于Observable的代碼!
前面代碼中最重要的一點是,在最后一步中,我們似乎重新繪制了我們收到的每個結果的整個UI。 但這里是虛擬DOM閃耀的地方。 無論我們重新呈現頁面多少次,虛擬DOM將始終確保僅呈現差異,從而使其非常高效。 如果虛擬DOM沒有更改,則不會在頁面中呈現任何更改。
這樣我們就不必擔心添加或刪除元素了。 我們每次只渲染整個應用程序,我們讓Virtual DOM找出實際更新的內容。
Model-View-Intent我們用于構建維基百科實時搜索的架構方法不僅僅是另一個框架的編程UI方法。結構化代碼背后有一個設計模式,就像我們做的那樣:Model-View-Intent(MVI)。
Model-View-Intent是一個由Cycle.js創建者AndréStaltz創建的術語,用于受模型 - 視圖 - 控制器(MVC)架構啟發的體系結構.在MVC中,我們將應用程序的功能分為三個部分: 模型,視圖和控制器。 在MVI中,三個組件是模型,視圖和意圖。 MVI旨在適應像手套一樣的Reactive編程模型。
MVI是被動的,意味著每個組件都會觀察其依賴關系并對依賴項的更改做出反應。 這與MVC不同,MVC中的組件知道其依賴項并直接修改它們。 組件(C)聲明哪些其他組件影響它,而不是明確更新(C)的其他組件。
MVI中的三個組件由Observables表示,每個組件的輸出是另一個組件的輸入。
該模型表示當前的應用程序狀態。 它從intent中獲取已處理的用戶輸入,并輸出有關視圖消耗的數據更改的事件。
視圖是我們模型的直觀表示。 它采用具有模型狀態的Observable,并輸出所有潛在的DOM事件和頁面的虛擬樹。
意圖是MVI中的新組件。意圖從用戶獲取輸入并將其轉換為我們模型中的操作。如果我們重新調整和重命名我們的代碼,我們可以在我們的應用程序中使這三種組件更清晰:
cycle/index-mvi.js
function intent(JSONP) { return JSONP.filter(function(res$) { return res$.request.indexOf(API_URL) === 0; }) .concatAll() .pluck("query", "search"); } function model(actions) { return actions.startWith([]); } function view(state) { return state.map(function(linkArray) { return h("div", [ h("h1", "Wikipedia Search "), h("input", {className: "search-field", attributes: {type: "text"}}), h("hr"), h("div", linkArray.map(function(link) { return h("div", [ h("a", { href: WIKI_URL + link.title }, link.title) ]); })) ]); }); } function userIntent(DOM) { return DOM.select(".search-field") .events("input") .debounce(300) .map(function(e) { return e.target.value }) .filter(function(value) { return value.length > 2 }) .map(function(search) { return API_URL + search }); } function main(responses) { return { DOM: view(model(intent(responses.JSONP))), JSONP: userIntent(responses.DOM) }; } Cycle.run(main, { DOM: CycleDOM.makeDOMDriver("#container"), JSONP: CycleJSONP.makeJSONPDriver() });
通過將模型,視圖和意圖拆分為多帶帶的函數,我們使代碼更加清晰。 (另一個意圖,userIntent,是JSONP驅動程序的輸入。)大多數應用程序邏輯在我們傳遞給main函數中的DOM驅動程序的屬性中表示為這三個函數的組合:
function main(responses) { return { DOM: view(model(intent(responses.JSONP))), JSONP: userIntent(responses.DOM) }; }
它沒有那么多功能!
創建可重用的小部件隨著我們制作更復雜的應用程序,我們希望重用一些UI組件。 我們的維基百科搜索應用程序很小,但是它已經有一些可以在其他應用程序中重用的組件。 以搜索輸入框為例。 我們絕對可以將它變成自己的小部件。
目標是將我們的小部件封裝在自己的組件中,以便我們將其用作任何其他DOM元素。 我們還應該能夠使用我們想要的任何屬性來參數化組件。 然后我們將在我們的應用程序中使用它,如下所示:
var wpSearchBox = searchBox({ props$: Rx.Observable.just({ apiUrl: API_URL }) });
我們將使用Cycle.js引入的概念構建我們的小部件,它將一個Observable事件作為輸入,并輸出一個Observable,其結果是將這些輸入應用于其內部邏輯。
讓我們開始構建搜索框組件。 我們首先創建一個函數,它接受一個響應參數,我們將從主應用程序傳遞任何我們想要的屬性:
cycle/searchbox.js
var Cycle = require("@cycle/core"); var CycleDOM = require("@cycle/dom"); var Rx = Cycle.Rx; var h = CycleDOM.h; var a; function searchBox(responses) { var props$ = responses.props$; var apiUrl$ = props$.map(function (props) { return props["apiUrl"]; }).first(); }
searchBox接收的每個參數都是一個Observable。 在這種情況下,props $是一個Observable,它發出一個包含Wikipedia搜索框配置參數的JavaScript對象。
檢索屬性后,我們為窗口小部件定義虛擬樹。 在我們的例子中,它只是一個非常簡單的輸入字段:
cycle/searchbox.js
var vtree$ = Rx.Observable.just( h("div", { className: "search-field" }, [ h("input", { type: "text" }) ]) );
我們希望所有東西都是一個Observable,所以我們將虛擬樹包裝在一個Observable中,它只返回一個Observable,它發出我們傳遞它的值。
現在,只要用戶在輸入字段中鍵入搜索詞,我們就需要搜索框來查詢Wikipedia API。 我們重用上一節函數userIntent中的代碼:
cycle/searchbox.js
var searchQuery$ = apiUrl$.flatMap(function (apiUrl) { return responses.DOM.select(".search-field").events("input") .debounce(300) .map(function (e) { return e.target.value; }) .filter(function (value) { return value.length > 3; }) .map(function (searchTerm) { return apiUrl + searchTerm; }); });
我們仍然需要將searchQuery的輸出連接到JSON驅動程序的輸入。 我們就像在正常的Cycle應用程序中那樣做:
cycle/searchbox.js
return { DOMTree: vtree$, JSONPQuery: searchQuery$ };
最后,我們不應該忘記導出搜索框小部件:
cycle/searchbox.js
module.exports = searchBox; // Export it as a module
現在我們已準備好在您的應用程序中使用搜索框小部件。 主要方法現在看起來像這樣:
cycle/index-mvi2.js
var h = CycleDOM.h; ? var SearchBox = require("./searchbox"); function main(responses) { ? var wpSearchBox = SearchBox({ DOM: responses.DOM, props$: Rx.Observable.just({ apiUrl: API_URL }) }); ? var searchDOM$ = wpSearchBox.DOMTree; var searchResults$ = responses.JSONP .filter(function(res$) { return res$.request.indexOf(API_URL) === 0; }) .concatAll() .pluck("query", "search") .startWith([]); return { ? JSONP: wpSearchBox.JSONPQuery, ? DOM: Rx.Observable.combineLatest( searchDOM$, searchResults$, function(tree, links) { return h("div", [ h("h1", "Wikipedia Search "), tree, h("hr"), h("div", links.map(function(link) { return h("div", [ h("a", { href: WIKI_URL + link.title }, link.title) ]); })) ]); }) }; } Cycle.run(main, { DOM: CycleDOM.makeDOMDriver("#container"), JSONP: CycleJSONP.makeJSONPDriver() });
現在我們將處理用戶輸入和呈現搜索框的責任委托給wpSearchBox小部件,我們可以在另一個需要查詢URL API的搜索框的應用程序中輕松地重用該小部件。 這些是主要的變化:
導入我們剛剛創建的searchBox小部件。
創建一個SearchBox實例,傳遞DOM驅動程序和我們想要搜索小部件的屬性。
我們的wpSearchBox最終將從其DOMTree Observable中發出項目。 我們在這里分配它以便在我們渲染實際DOM時使用它們。
我們將Wikipedia查詢URL發送到JSONP驅動程序,以便檢索其結果。 當這些可用時,它將在response.JSONP中發出它們,我們在searchResults中對它進行了優化。
為了渲染最終的DOM樹,我們使用combineLatest與searchDOM和searchResults。它們中的每一個都會導致布局發生變化,因此只要這兩個Observable中的一個發出一個項目,我們就會重新渲染DOM樹。
有了最終的代碼,我們可以看到Cycle.js的最大亮點。 框架中沒有不同的類,特殊類型或“魔術”。 這是所有無副作用的函數,它們接受Observable并輸出更多的Observable。 只有這樣,我們才有一個簡潔的Web應用程序框架,清晰,反應靈敏,使用起來很有趣。 它不惜一切代價避免副作用,使我們的Web應用程序更加健壯。
改進的想法除了迫切需要更好的圖形設計外,我們的應用程序可以使用一些功能,而不僅僅是快速重定向到維基百科的結果:
讓用戶為特定結果添加書簽。 您可以在列表中的每個結果旁邊添加一個小星星,這樣當用戶點擊時,它會將該結果保存為收藏夾。 你可以將星星變成自己的小部件。 如果您使用某些持久性API(反應性!),例如本地存儲或IndexedDB,則需要額外的分數。
如果用戶單擊鏈接,則在屏幕右側顯示結果的“預覽”,其中包含概要及其相關元信息。 如果用戶想要查看實際的Wikipedia結果,則可以在其中包含“閱讀更多”鏈接。 將其實現為小部件。
總結現在您知道如何開發使用現代技術的Web應用程序而不放棄響應性理念。 本章提供了如何使用Observables和RxJS作為其他框架或應用程序的內部引擎的想法。 通過站在Observables的肩膀和活躍的生活方式,我們可以極大地簡化Web應用程序并將狀態降低到最小的表達,使我們的Web應用程序不那么脆弱和易于維護。
感謝您閱讀本書。 我希望它能幫助您重新思考開發JavaScript應用程序的方式,并挑戰一些有關編程的現有概念。 這是快速,強大和反應性的軟件!
關注我的微信公眾號,更多優質文章定時推送
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108196.html
摘要:由于技術棧的學習,筆者需要在原來函數式編程知識的基礎上,學習的使用。筆者在社區發現了一個非常高質量的響應式編程系列教程共篇,從基礎概念到實際應用講解的非常詳細,有大量直觀的大理石圖來輔助理解流的處理,對培養響應式編程的思維方式有很大幫助。 showImg(https://segmentfault.com/img/bVus8n); [TOC] 一. 響應式編程 響應式編程,也稱為流式編程...
摘要:響應式編程第一章響應式響應式編程第二章序列的深入研究響應式編程第三章構建并發程序響應式編程第四章構建完整的應用程序響應式編程第五章使用管理時間響應式編程第六章使用的響應式應用程序使用管理時間自從接觸,就開始在我的項目中使用它。 Rxjs 響應式編程-第一章:響應式Rxjs 響應式編程-第二章:序列的深入研究Rxjs 響應式編程-第三章: 構建并發程序Rxjs 響應式編程-第四章 構建完...
摘要:響應式編程具有很強的表現力,舉個例子來說,限制鼠標重復點擊的例子。在響應式編程中,我把鼠標點擊事件作為一個我們可以查詢和操作的持續的流事件。這在響應式編程中尤其重要,因為我們隨著時間變換會產生很多狀態片段。迭代器模式的另一主要部分來自模式。 Rxjs 響應式編程-第一章:響應式Rxjs 響應式編程-第二章:序列的深入研究Rxjs 響應式編程-第三章: 構建并發程序Rxjs 響應式編程-...
摘要:建立一個實時地震我們將為地震儀表板應用程序構建服務器和客戶端部件,實時記錄地震的位置并可視化顯示。添加地震列表新儀表板的第一個功能是顯示地震的實時列表,包括有關其位置,大小和日期的信息。 Rxjs 響應式編程-第一章:響應式Rxjs 響應式編程-第二章:序列的深入研究Rxjs 響應式編程-第三章: 構建并發程序Rxjs 響應式編程-第四章 構建完整的Web應用程序Rxjs 響應式編程-...
摘要:接下來,我們將實現一個真實的應用程序,顯示幾乎實時發生的地震。得到的由表示,其中包含和的合并元素。如果不同同時傳出元素,合并序列中這些元素的順序是隨機的。是操作序列的強大操作符。但是的方法仍在運行,表明取消并不會取消關聯的。 Rxjs 響應式編程-第一章:響應式Rxjs 響應式編程-第二章:序列的深入研究Rxjs 響應式編程-第三章: 構建并發程序Rxjs 響應式編程-第四章 構建完整...
閱讀 3648·2021-10-09 09:58
閱讀 1188·2021-09-22 15:20
閱讀 2495·2019-08-30 15:54
閱讀 3510·2019-08-30 14:08
閱讀 887·2019-08-30 13:06
閱讀 1818·2019-08-26 12:16
閱讀 2679·2019-08-26 12:11
閱讀 2508·2019-08-26 10:38