React學(xué)習(xí)(一)

框架

根據(jù)REACT官網(wǎng)的推薦,選擇的框架為 React + Redux + wepack + es6

架構(gòu)為MVC(Model-View-Controller):
<li>model持有UI要展現(xiàn)的數(shù)據(jù)(store)</li>
<li>View即UI的展現(xiàn) (React)</li>
<li>Controller用于控制 (Reducer)</li>


經(jīng)典前端目錄結(jié)構(gòu)
- webapp/               # webapp根目錄
  - src/                # 開發(fā)目錄
    + css/              # css資源目錄
    + img/              # webapp圖片資源目錄
    - js/               # webapp js&jsx資源目錄
      - components/     # 標(biāo)準(zhǔn)組件存放目錄
          - foo/        # 組件foo
            + css/      # 組件foo的樣式
            + js/       # 組件foo的邏輯
            + tmpl/     # 組件foo的模板
            index.js    # 組件foo的入口
          + bar/        # 組件bar
      + lib/            # 第三方純js庫
      ...               # 根據(jù)項(xiàng)目需要任意添加的代碼目錄
    + tmpl/             # webapp前端模板資源目錄
    a.html              # webapp入口文件a
    b.html              # webapp入口文件b
  - assets/             # 編譯輸出目錄肥印,即發(fā)布目錄
    + js/               # 編譯輸出的js目錄
    + img/              # 編譯輸出的圖片目錄
    + css/              # 編譯輸出的css目錄
    a.html              # 編譯輸出的入口a
    b.html              # 編譯處理后的入口b
  + mock/               # 假數(shù)據(jù)目錄
  app.js                # 本地server入口
  routes.js             # 本地路由配置
  webpack.config.js     # webpack配置文件
  gulpfile.js           # gulp任務(wù)配置
  package.json          # 項(xiàng)目配置
  README.md             # 項(xiàng)目說明

REACT

React 的主要思想是通過構(gòu)建可復(fù)用組件來構(gòu)建用戶界面妄讯。所謂組件其實(shí)就是 有限狀態(tài)機(jī)依鸥,通過狀態(tài)渲染對應(yīng)的界面拆火,且每個組件都有自己的生命周期抗悍,它規(guī)定了組件的狀態(tài)和方法需要在哪個階段進(jìn)行改變和執(zhí)行亡笑。

狀態(tài)機(jī)

生命周期:

// react-lifecycle mixin
import React from 'react';
import ReactDom from 'react-dom';
import LifeCycle from 'react-lifecycle';

const body = document.body;

const MyComponent = React.createClass({
  mixins: [LifeCycle],

  render() {
    console.log('render');
    return null;
  }
});

ReactDom.render(<MyComponent />, body);
ReactDom.unmountComponentAtNode(body);
ReactDom.render(<MyComponent />, body);
ReactDom.render(<MyComponent />, body);

在自定義 React 組件時,根據(jù)需要會在組件生命周期的不同階段實(shí)現(xiàn)不同的邏輯偿荷。為了查看 組件生命周期的執(zhí)行順序窘游,你可以使用 react-lifecycle mixin,將此 mixin 添加到需要觀察的組件中跳纳,當(dāng)任何生命周期方法被調(diào)用時,都能在控制臺觀察到對應(yīng)的生命周期的調(diào)用時狀態(tài)贪嫂。

生命周期

Redux(數(shù)據(jù)流)

state

這個對象就像 “Model”寺庄,區(qū)別是它并沒有 setter(修改器方法)。因此其它的代碼不能隨意修復(fù)它力崇,造成難以復(fù)現(xiàn)的 bug斗塘。
要想更新 state 中的數(shù)據(jù),你需要發(fā)起一個 action亮靴。

{
  todos: [{
    text: 'Eat food',
    completed: true
  }, {
    text: 'Exercise',
    completed: false
  }],
  visibilityFilter: 'SHOW_COMPLETED'
}

action

Action 就是一個普通 JavaScript 對象

{ type: 'ADD_TODO', text: 'Go to swimming pool' }
{ type: 'TOGGLE_TODO', index: 1 }
{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }

reducer

reducer 只是一個接收 state 和 action馍盟,并返回新的 state 的函數(shù)。

function visibilityFilter(state = 'SHOW_ALL', action) {
  if (action.type === 'SET_VISIBILITY_FILTER') {
    return action.filter;
  } else {
    return state;
  }
}

function todos(state = [], action) {
  switch (action.type) {
  case 'ADD_TODO':
    return state.concat([{ text: action.text, completed: false }]);
  case 'TOGGLE_TODO':
    return state.map((todo, index) =>
      action.index === index ?
        { text: todo.text, completed: !todo.completed } :
        todo
   )
  default:
    return state;
  }
}

webpack

官網(wǎng)對webpack的定義是MODULE BUNDLER茧吊,他的目的就是把有依賴關(guān)系的各種文件打包成一系列的靜態(tài)資源贞岭。

Paste_Image.png

每個項(xiàng)目下都必須配置有一個 webpack.config.js

var webpack = require('webpack');
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js');
 
module.exports = {
    //插件項(xiàng)
    plugins: [commonsPlugin],
    //頁面入口文件配置
    entry: {
        index : './src/js/page/index.js'
    },
    //入口文件輸出配置
    output: {
        path: 'dist/js/page',
        filename: '[name].js'
    },
    module: {
        //加載器配置
        loaders: [
            { test: /\.css$/, loader: 'style-loader!css-loader' },
            { test: /\.js$/, loader: 'jsx-loader?harmony' },
            { test: /\.scss$/, loader: 'style!css!sass?sourceMap'},
            { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}
        ]
    },
    //其它解決方案配置
    resolve: {
        root: 'E:/github/flux-example/src', //絕對路徑
        extensions: ['', '.js', '.json', '.scss'],
        alias: {
            AppStore : 'js/stores/AppStores.js',
            ActionType : 'js/actions/ActionType.js',
            AppAction : 'js/actions/AppAction.js'
        }
    }
};
ES6

ECMAScript 6.0(簡稱ES6)是JavaScript語言的下一代標(biāo)準(zhǔn).

Bable

能夠?qū)崿F(xiàn) ES6 到 ES5 的代碼轉(zhuǎn)換多虧了 Babel (以前叫 6to5) 以及 Traceur 之類的項(xiàng)目八毯。這些轉(zhuǎn)換器 (更準(zhǔn)確地說是源代碼到源代碼的編譯器) 可以把你寫的符合 ECMAScript 6 標(biāo)準(zhǔn)的代碼完美地轉(zhuǎn)換為 ECMAScript 5 標(biāo)準(zhǔn)的代碼,并且可以確保良好地運(yùn)行在所有主流 JavaScript 引擎中瞄桨。

ES6語法例子

import 'core-js/shim';

export default class Person {

  constructor( name ) {
    this.name = name;
  }

  sayHello() {
    return `Hello ${ this.name }!`;
  }

  sayHelloThreeTimes() {
    let hello = this.sayHello();
    return `${ hello } `.repeat(3);
  }
}

參考資料:
react
http://segmentfault.com/a/1190000003940416?utm_source=APP&utm_medium=iOS&utm_campaign=socialShare&from=groupmessage&isappinstalled=1
http://top.jobbole.com/15576/

react-router
https://github.com/rackt/react-router

redux
http://camsong.github.io/redux-in-chinese/
https://github.com/rackt/redux examples

redux-router
https://github.com/acdlite/redux-router examples

redux-form
https://github.com/erikras/redux-form

babel
es6
http://es6.ruanyifeng.com/#docs/intro

webpack
http://segmentfault.com/a/1190000003499526
http://segmentfault.com/a/1190000002551952
https://blog.crazycoder.cc/p/react-using-webpack

fetch
http://www.thinksaas.cn/group/topic/396019/
http://www.tuicool.com/articles/QZBJ7zJ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末话速,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芯侥,更是在濱河造成了極大的恐慌泊交,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柱查,死亡現(xiàn)場離奇詭異廓俭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唉工,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門白指,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酵紫,你說我怎么就攤上這事告嘲。” “怎么了奖地?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵橄唬,是天一觀的道長。 經(jīng)常有香客問我参歹,道長仰楚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任犬庇,我火速辦了婚禮僧界,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臭挽。我一直安慰自己捂襟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布欢峰。 她就那樣靜靜地躺著葬荷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纽帖。 梳的紋絲不亂的頭發(fā)上宠漩,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音懊直,去河邊找鬼扒吁。 笑死,一個胖子當(dāng)著我的面吹牛室囊,可吹牛的內(nèi)容都是我干的雕崩。 我是一名探鬼主播魁索,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晨逝!你這毒婦竟也來了蛾默?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤捉貌,失蹤者是張志新(化名)和其女友劉穎支鸡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趁窃,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牧挣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醒陆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瀑构。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刨摩,靈堂內(nèi)的尸體忽然破棺而出寺晌,到底是詐尸還是另有隱情,我是刑警寧澤澡刹,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布呻征,位于F島的核電站,受9級特大地震影響罢浇,放射性物質(zhì)發(fā)生泄漏陆赋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一嚷闭、第九天 我趴在偏房一處隱蔽的房頂上張望攒岛。 院中可真熱鬧,春花似錦胞锰、人聲如沸灾锯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挠进。三九已至,卻和暖如春誊册,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暖璧。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工案怯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澎办。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓嘲碱,卻偏偏與公主長得像金砍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子麦锯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容