ReactNative學習-什么是iflux?

什么是iflux ?

iflux = immutable.js + react.js

NPM

什么是React.js ?

React.js猶如Facebook的文化基因所強調的一樣move fast and break things, 在快速前進中打破了很多我們對于web開發的固有認識。
更厲害的是React把這種創新平移到移動開發(React native)實現了Learn once, Write everywhere.

React的特點。

  1. 強調組件化的開發方式(更高的抽象層次,更好的分離關注點)

  2. 聲明式的開發風格(更好的表現力)

  3. 單向的數據流動(簡單可預測)

  4. 超高性能的渲染60fps不是夢 (掌聲在哪里?)

  5. 最大的創新源于virtual dom (以及virtual native)

  6. 輕量,可以在現有的系統中快速試錯

  7. 精確的生命周期,更簡單的整合第三方的庫(jquery)

關于更多

因為React的定位就是輕量級高效組件式的view library,但是在我們實際的應用開發工程中不僅僅需要處理view的問題,更復雜的是對于狀態的控制。
官方的flux架構提供了一個很好的針對React的架構指導,但是代碼量很大。
說到底flux就是在解決一個數據流向以及控制狀態變化問題。這點om確實做的非常出色,
借助于Clojure的數據的特性(1. 數據不可變 2. 持久化數據結構 3.共享數據結構)在不斷的追尋下,immutable.js出現在了眼前,如獲至寶。
隨著對immutable.js深入挖掘,發現正好契合了React的架構特點,可以使用Immutable很好的管理我們的Store,因為Immutable強調值語義,
能夠更好的追蹤狀態的變化(cursor)且帶來了更好的性能。

整體思路

  • 建議:優先選擇connectToStore
+-----------------------+
|       WebApi          |
+-----------------------+
          |  
         \|/
+-----------------------+
|   Store(immutable)   |<-----+
+-----------------------+      |
           | //es5的風格        |
           | StoreMixin        | msg(EventEmitter)
          \|/                  |
+------------------------+     |
|     React App          |-----|
+------------------------+
|      <Layout>          |
|        <SearchForm/>   |
|        <Toolbar/>      |
|        <DataGrid/>     |
|       </Layout>        |
+------------------------+

一個應用只有一個Store,單根數據源,單向數據流動,數據沉淀在頂層。
且通過PureRenderMix可以獲取更好的性能。簡直就是為React私人定制一般。

于是,順其自然的寫了iflux去更好的粘合React和immutable。

整體思路:

  1. React只承擔view應該承擔的事情(1. 資料呈現 2. 用戶交互) 不處理任何的業務邏輯,就是根據數據去渲染dom即可,這樣view可以做的很輕。

  2. 應用的全部數據沉淀在一個Store中,當全部數據在頂層時,很多事情都變得簡單,因為獲取數據變得十分廉價。無論是校驗和對數據的轉換控制都變得非常簡單。

  3. React只是取數據渲染,其他的比如狀態的變化全部通過事件pubsub通知appstore去更新數據。如果狀態不會影響其他組件的級聯變化可以放在組件內部消化掉。

  4. 所有的ajax封裝在webapi模塊中,全部promise化。回調回來通過cursor更新store, cursor更新store, store通知React去rerender。

  5. 區分View component 和 pure component。

如何使用?


mkdir hello
cd hello
npm init
npm install react immutable iflux --save
npm install babel-loader --save-dev

?  iflux-demo  tree -L 3
.
├── apps                #we like django's app-style
│   └── index           #app-name
│       ├── index.js    #viewcontainer component
│       ├── component   #collect of dump components
│       ├── store.js    #immutable store
│       └── webapi.js   #fetch remote resource
├── node_modules
├── package.json
└── webpack.config.js

5 directories, 4 files

例子

//webapi.js

export const fetchGithub = (name) => {
  return fetch(`http://github.com/${name}`)
};

export default {
  fetchGithub
};


//store.js
import { Store, msg } from 'iflux';
import { fromJS } from 'immutable';
import { fetchGithub } from './webapi';

const appStore = Store({
  name: '',
  githubInfo: {}
});

exports default appStore;

//when use immutable's cursor to update store
//react's view will auto re-render
msg.on('updateName', (name) => {
  appStore.cursor().set('name', name);
});

msg.on('submit', async () => {
  const data = await fetchGithub(name);
  appStore.cursor.set('githubInfo', fromJS(data));
});


//index.js

//es5的樣式
import React from 'react';
import {msg, mixins} from 'iflux';
import appStore from './store';
const {StoreMixin} = mixins;


const IfluxApp = React.createClass({
  //自動將Store中的data混入到state
  mixins: [StoreMixin(appStore)],

  render() {
    var store = appStore.data();

    return (
      <div>
        <form onSubmit={this._submit}>
            <input name="name" onChange={this._handleChange}/>
        </form>
        <div>
          {store.get('githubInfo')}
        </div>
      </div>
    );
  },

  _handleChange(e) {
    msg.emit('updateName', e.target.value);
  },

  _submit() {
    msg.emit('getGithubInfo');
  }
});


//es6的樣式
import React from 'react';
import { msg, connectToStore } from 'iflux';
import appStore from './store';

class IfluxApp extends React.Component {
  render() {
    const {store} = this.props;

    return (
      <div>
        <form onSubmit={this._submit}>
            <input name="name" onChange={this._handleChange}/>
        </form>
        <div>
          {store.get('githubInfo')}
        </div>
      </div>
    );
  }
}

export default connectToStore(appStore)(IfluxApp);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,721評論 25 708
  • 原教程內容詳見精益 React 學習指南,這只是我在學習過程中的一些閱讀筆記,個人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,851評論 1 18
  • 在我家鄉西邊的住宅區,幾乎每家每戶的車庫里都停著三輛車,給丈夫、妻子和正處青春期的孩子。在 IHOP 餐廳(Int...
    jay4497閱讀 448評論 0 0
  • C++ 重載運算符和重載函數 一元運算符只對一個操作數進行操作,下面是一元運算符的實例: 遞增運算符( ++ )和...
    資深小夏閱讀 354評論 0 0
  • 我常常在腦中勾勒我童年的記憶: 夢幻般的色彩,一年四季,日落輪回,都是那么漫長,卻又是那么自在,那么癡迷,永不倦,...
    不死青春閱讀 141評論 0 1