符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
是什么
创新互联建站的客户来自各行各业,为了共同目标,我们在工作上密切配合,从创业型小企业到企事业单位,感谢他们对我们的要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。专业领域包括成都做网站、网站制作、电商网站开发、微信营销、系统平台开发。
Cycle.js 是一个极简的JavaScript框架(核心部分加上注释125行),提供了一种函数式,响应式的人机交互接口(以下简称HCI):
函数式
Cycle.js 把应用程序抽象成一个纯函数 main(),从外部世界读取副作用(sources),然后产生输出(sinks) 传递到外部世界,在那形成副作用。这些外部世界的副作用,做为Cycle.js的插件存在(drivers),它们负责:处理DOM、提供HTTP访问等。
响应式
Cycle.js 使用 rx.js 来实现关注分离,这意味着应用程序是基于事件流的,数据流是Observable 的:
HCI
HCI 是双向的对话,人机互为观察者
在这个交互模型中,人机之间的信息流互为输出输出,构成一个循环,也即 Cycle这一命名所指,框架的Logo更是以莫比乌斯环贴切的描述了这个循环。cycle_log
唯一的疑惑会是:循环无头无尾,信息流从何处发起?好问题,答案是:
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() 提供的这个初始值,整个流程得以启动,自此形成一个闭环,一个事件驱动的永动机 :)
Drivers
driver 是 Cycle.js 主函数 main()和外部世界打交道的接口,比如HTTP请求,比如DOM操作,这些是由具体的driver 负责的,它的存在确保了 main()的纯函数特性,所有副作用和繁琐的细节皆由 driver来实施——所以 @cycle/core 才125 行,而@cycle/dom 却有 4052 行之巨。
driver也是一个函数,从流程上来说,driver 监听sinks(main()的输出)做为输入,执行一些命令式的副作用,并产生出sources做为main()的输入。
DOM Driver
即 @cycle/dom,是使用最为频繁的driver。实际应用中,我们的main()会与DOM进行交互:
组件化
每个Cycle.js应用程序不管多复杂,都遵循一套输入输出的基本法,因此,组件化是很容易实现,无非就是函数对函数的组合调用
实战
准备工作
安装全局模块
依赖模块一览
"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起步,回显计数
demo地址: http://output.jsbin.com/lamexacaku
HTML代码
components
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 =>) } } Cycle.run(main, { DOM: makeDOMDriver('#container'), })Clicked {count} times~
不难看出:
交互实例2
功能: 一个button一个框,输入并点button后,通过Github api搜索相关的Repo,回显总数并展示第一页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} ) return { DOM: dom$, HTTP: http$, } } const driver = { DOM: makeDOMDriver('#container'), HTTP: makeHTTPDriver(), } Cycle.run(main, driver)
{JSON.loading ? 'Loading...' : `total: ${JSON.total_count}`}{ JSON.items && JSON.items.map(repo =>
repo.full_name { repo.html_url }) }
有了实例1做铺垫,这段代码也就通俗易懂了,需要提示的是:
小结
寥寥数语,并不足以概括Cycle.js,比如 MVI设计模式,Driver的编写,awesome-cycle 这些进阶项,还是留给看官们自行探索吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。