欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

學習RxJS之JavaScript框架Cycle.js

 更新時間:2019年06月17日 09:15:09   作者:Unknw  
這篇文章主要介紹了學習RxJS之JavaScript框架Cycle.js ,它是一個極簡的JavaScript框架(核心部分加上注釋125行),提供了一種函數(shù)式,響應式的人機交互接口,需要的朋友可以參考下

是什么

Cycle.js 是一個極簡的JavaScript框架(核心部分加上注釋125行),提供了一種函數(shù)式,響應式的人機交互接口(以下簡稱HCI):

函數(shù)式

Cycle.js 把應用程序抽象成一個純函數(shù) main(),從外部世界讀取副作用(sources),然后產(chǎn)生輸出(sinks) 傳遞到外部世界,在那形成副作用。這些外部世界的副作用,做為Cycle.js的插件存在(drivers),它們負責:處理DOM、提供HTTP訪問等。

響應式
Cycle.js 使用 rx.js 來實現(xiàn)關注分離,這意味著應用程序是基于事件流的,數(shù)據(jù)流是Observable 的:

HCI

HCI 是雙向的對話,人機互為觀察者

在這個交互模型中,人機之間的信息流互為輸出輸出,構成一個循環(huán),也即 Cycle這一命名所指,框架的Logo更是以莫比烏斯環(huán)貼切的描述了這個循環(huán)。cycle_log

唯一的疑惑會是:循環(huán)無頭無尾,信息流從何處發(fā)起?好問題,答案是:

However, we need a .startWith() to give a default value. Without this, nothing would be shown! Why? Because our sinks is reacting to sources, but sources is reacting to sinks. If no one triggers the first event, nothing will happen. —— via examples

有了.startWith() 提供的這個初始值,整個流程得以啟動,自此形成一個閉環(huán),一個事件驅動的永動機 :)

Drivers

driver 是 Cycle.js 主函數(shù) main()和外部世界打交道的接口,比如HTTP請求,比如DOM操作,這些是由具體的driver 負責的,它的存在確保了 main()的純函數(shù)特性,所有副作用和繁瑣的細節(jié)皆由 driver來實施——所以 @cycle/core 才125 行,而@cycle/dom 卻有 4052 行之巨。

driver也是一個函數(shù),從流程上來說,driver 監(jiān)聽sinks(main()的輸出)做為輸入,執(zhí)行一些命令式的副作用,并產(chǎn)生出sources做為main()的輸入。

DOM Driver

即 @cycle/dom,是使用最為頻繁的driver。實際應用中,我們的main()會與DOM進行交互:

  • 需要傳遞內容給用戶時,main()會返新的DOM sinks,以觸發(fā)domDriver()生成virtual-dom,并渲染
  • main()訂閱domDriver()的輸出值(做為輸入),并據(jù)此進行響應

組件化
每個Cycle.js應用程序不管多復雜,都遵循一套輸入輸出的基本法,因此,組件化是很容易實現(xiàn),無非就是函數(shù)對函數(shù)的組合調用

實戰(zhàn)

準備工作

安裝全局模塊

依賴模塊一覽

"devDependencies": {
"babel-plugin-transform-react-jsx": "^6.8.0",
"babel-preset-es2015": "^6.9.0",
"babelify": "^7.3.0",
"browserify": "^13.0.1",
"uglifyify": "^3.0.1",
"watchify": "^3.7.0"
},
"dependencies": {
"@cycle/core": "^6.0.3",
"@cycle/dom": "^9.4.0",
"@cycle/http": "^8.2.2"
}

.babelrc (插件支持JSX語法)

{
"plugins": [
["transform-react-jsx", { "pragma": "hJSX" }]
],
"presets": ["es2015"]
}

Scripts(熱生成和運行服務器)

"scripts": {
"start": "http-server",
"build": "../node_modules/.bin/watchify index.js -v -g uglifyify -t babelify -o bundle.js"
}

以下實例需要運行時,可以開兩個shell,一個跑熱編譯,一個起http-server(愛用currently亦可

交互實例1

功能:兩個button,一加一減, 從0起步,回顯計數(shù)
demo地址: http://output.jsbin.com/lamexacaku

HTML代碼

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>components</title>
</head>
<body>
<div id="container"></div>
<script src="bundle.js"></script>
</body>
</html>

index.js

import Cycle from '@cycle/core'
import { makeDOMDriver, hJSX } from '@cycle/dom'
function main({ DOM }) {
const decrement$ = DOM.select('.decrement').events('click').map(_ => -1)
const increment$ = DOM.select('.increment').events('click').map(_ => +1)
const count$ = increment$.merge(decrement$)
.scan((x, y) => x + y)
.startWith(0)
return {
DOM: count$.map(count =>
<div>
<input type="button" className="decrement" value=" - "/>
<input type="button" className="increment" value=" + "/>
<div>
Clicked {count} times~
</div>
</div>
)
}
}
Cycle.run(main, {
DOM: makeDOMDriver('#container'),
})

不難看出:

  • main()是個純函數(shù),從始至終不依賴外部狀態(tài),它的所有動力來自于DOM事件源click,這個狀態(tài)機依靠Observable.prototype.scan()得以計算和傳遞,最后生成sinks傳遞給DOM driver以渲染;
  • 啟動了這個循環(huán)是 .startWith();
  • Cycle.run是應用程序的入口,加載main()和DOM driver,后者對一個HTML容器進行渲染輸出

交互實例2

功能: 一個button一個框,輸入并點button后,通過Github api搜索相關的Repo,回顯總數(shù)并展示第一頁Repo列表

index.js

import Cycle from '@cycle/core'
import { makeDOMDriver, hJSX } from '@cycle/dom'
import { makeHTTPDriver } from '@cycle/http'
const GITHUB_SEARCH_URL = 'https://api.github.com/search/repositories?q='
function main(responses$) {
const search$ = responses$.DOM.select('input[type="button"]')
.events('click')
.map(_ => { return { url: GITHUB_SEARCH_URL } })
const text$ = responses$.DOM.select('input[type="text"]')
.events('input')
.map(e => { return { keyword: e.target.value } })
const http$ = search$.withLatestFrom(text$, (search, text)=> search.url + text.keyword)
.map(state => { return { url: state, method: 'GET' } })
const dom$ = responses$.HTTP
.filter(res$ => res$.request.url && res$.request.url.startsWith(GITHUB_SEARCH_URL))
.mergeAll()
.map(res => JSON.parse(res.text))
.startWith({ loading: true })
.map(JSON => {
return <div>
<input type="text"/>
<input type="button" value="search"/>
<br/>
<span>
{JSON.loading ? 'Loading...' : `total: ${JSON.total_count}`}
</span>
<ol>
{
JSON.items && JSON.items.map(repo =>
<div>
<span>repo.full_name</span>
<a href={ repo.html_url }>{ repo.html_url }</a>
</div>
)
}
</ol>
</div>
}
)
return {
DOM: dom$,
HTTP: http$,
}
}
const driver = {
DOM: makeDOMDriver('#container'),
HTTP: makeHTTPDriver(),
}
Cycle.run(main, driver)

有了實例1做鋪墊,這段代碼也就通俗易懂了,需要提示的是:

  • Rx的Observable對象,命名上約定以$符為結束,以示區(qū)分
  • Observable.prototype.withLatestFrom()的作用是:在當前Observable對象的事件觸發(fā)時(不同于 combineLatest),去合并參數(shù)的目標Observable對象的最新狀態(tài),并傳遞給下一級Observer
  • 以上項目完整實例,可在 /rockdragon/rx_practise/tree/master/src/web 找到

小結

寥寥數(shù)語,并不足以概括Cycle.js,比如 MVI設計模式,Driver的編寫,awesome-cycle 這些進階項,還是留給看官們自行探索吧。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaScript實現(xiàn)的石頭剪刀布游戲源碼分享

    JavaScript實現(xiàn)的石頭剪刀布游戲源碼分享

    這篇文章主要介紹了JavaScript實現(xiàn)的石頭剪刀布游戲源碼分享,挺好玩的小游戲,關鍵在一些算法上,需要的朋友可以參考下
    2014-08-08
  • JS實現(xiàn)字體選色板實例代碼

    JS實現(xiàn)字體選色板實例代碼

    這篇文章主要介紹了JS實現(xiàn)字體選色板實例代碼,有需要的朋友可以參考一下
    2013-11-11
  • JS異步執(zhí)行結果獲取的3種解決方式

    JS異步執(zhí)行結果獲取的3種解決方式

    這篇文章主要給大家介紹了關于JS異步執(zhí)行結果獲取的3種解決方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • JavaScript?賦值,淺復制和深復制的區(qū)別

    JavaScript?賦值,淺復制和深復制的區(qū)別

    這篇文章主要介紹了JavaScript?賦值,淺復制和深復制的區(qū)別,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • 原生js+canvas實現(xiàn)貪吃蛇效果

    原生js+canvas實現(xiàn)貪吃蛇效果

    這篇文章主要為大家詳細介紹了原生js+canvas實現(xiàn)貪吃蛇效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 根據(jù)對象的某一屬性進行排序的js代碼(如:name,age)

    根據(jù)對象的某一屬性進行排序的js代碼(如:name,age)

    實例為按降序排列,若想改為升序只需把比較器中的value2-value1改為value1-value2就可以了
    2010-08-08
  • 微信小程序前后端數(shù)據(jù)交互的詳細圖文教程

    微信小程序前后端數(shù)據(jù)交互的詳細圖文教程

    這篇文章主要給大家介紹了關于微信小程序前后端數(shù)據(jù)交互的相關資料,通過小程序向后端發(fā)送請求,然后后端從數(shù)據(jù)庫獲取車源和求購的數(shù)量反饋給小程序,最后將這兩個數(shù)據(jù)顯示出來,需要的朋友可以參考下
    2022-10-10
  • javascript隨機顯示背景圖片的方法

    javascript隨機顯示背景圖片的方法

    這篇文章主要介紹了javascript隨機顯示背景圖片的方法,涉及javascript隨機數(shù)的生成及頁面元素的操作技巧,需要的朋友可以參考下
    2015-06-06
  • javascriptvoid(0)含義以及與

    javascriptvoid(0)含義以及與"#"的區(qū)別講解

    今天小編就為大家分享一篇關于javascriptvoid(0)含義以及與"#"的區(qū)別講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • javascript 獲取圖片顏色

    javascript 獲取圖片顏色

    html 5.0的canvas可以獲取到圖片的像素點了。這樣,我們可以做很多以圖片有關的操作和渲染了。當然今后也會給瀏覽器渲染引擎更高的要求。(YY, 什么時候html渲染引擎也支持多核和GPU呢?)
    2009-04-04

最新評論