在《Redux系列01:从一个简单例子了解action、store、reducer》里面,咱们已经对redux的核心概念作了必要的讲解。接下来,一样是经过一个简单的例子,来说解如何将redux跟react应用结合起来。html
咱们知道,在类flux框架设计中,单向数据流转的方向无非以下:react
转换成redux的语言,就是这个样子。接下来就看实际例子,一个简单到不存在实用价值的todo list。git
本文的代码示例能够在github上下载,点击查看。README里有详细的运行步骤,照着作就能够了,这里也一块儿贴出来。github
首先安装依赖项npm
npm install
若是还没安装browserify
,那么也要安装一下redux
npm install -g browserify
而后,在当前目录运行以下脚本segmentfault
browserify app.js -o bundle/app.js -t [ babelify --presets [ es2015 react ] ]
在浏览器里打开index.html
,就能够看到效果了。运行效果以下,很挫吧。。。浏览器
因为代码实在太简单,这里就直接贴出来了。babel
首先,定义actionCreator。app
// action creator var addTodoActions = function(text){ return { type: 'add_todo', text: text }; };
而后,定义reducer,能够看到是对add_todo
事件进行了处理
// reducers var todoReducer = function(state, action){ if(typeof state === 'undefined'){ return []; } switch(action.type){ case 'add_todo': return state.slice(0).concat({ text: action.text, completed: false }); break; default: return state; } };
接着,之前面定义的reducer为参数,建立store
。
var store = Redux.createStore(todoReducer);
最后,到关键步骤啦,能够看到:
在getInitialState
里:经过store.getState()
获取数据进行初始的渲染。
在componentDidMount
里:监听store的状态变化,当状态变化时,触发onChange
回调。
在handleAdd
里:经过store.dispatch(addTodoActions(value))
修改state。(步骤二对这个进行了监听)
4.在onChange
里:获取最新的state,并从新渲染视图
var App = React.createClass({ getInitialState: function(){ return { items: store.getState() }; }, componentDidMount: function(){ var unsubscribe = store.subscribe(this.onChange); }, onChange: function(){ this.setState({ items: store.getState() }); }, handleAdd: function(){ var input = ReactDOM.findDOMNode(this.refs.todo); var value = input.value.trim(); if(value) store.dispatch(addTodoActions(value)); input.value = ''; }, render: function(){ return ( <div> <input ref="todo" type="text" placeholder="输入todo项" style={{marginRight:'10px'}} /> <button onClick={this.handleAdd}>点击添加</button> <ul> {this.state.items.map(function(item){ return <li>{item.text}</li>; })} </ul> </div> ); } }); ReactDOM.render( <App />, document.getElementById('container') );
整个例子看下来其实很是flux style,很是简单,连异步都没有涉及,因此也就不花过多篇幅进行讲解,相信看下代码,跑下文中的demo就能够理解了。
实际项目不可能像文中的这么简单,因此通常redux还要结合react-redux、redux-thunk等库使用,才能用到实战中去。这部分会在后续展开 :)