react-redux使用入门
安装npm install --save redux npm install --save react-redux npm install redux-thunk npm install --save-dev redux-devtools 上面的三个命令分别安装了redux库、React绑定库、redux-thunk中间件和开发者工具 建结构mkdir actions mkdir reducers mkdir components mkdir containers mkdir store 上面的命令在根目录下新建了五个文件夹
基本使用一个简单的例子,实现一个拉取豆瓣top250电影的列表 新建项目模板文件touch index.html 在根目录下新建index.html文件作为项目的模板文件,内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>hello</title> <script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script> </head> <body> <div id="app"></div> <script src="index.js"></script> </body> </html> 新建入口文件在根目录新建main.js作为我们的入口文件 touch main.js 内容如下 import React from 'react'; import {render} from 'react-dom'; import {Provider} from 'react-redux' import Douban from './containers/Douban' import configureStore from './store/configureStore' const store = configureStore(); render( <Provider store={store}> <Douban /> </Provider>,document.getElementById('app') ) 上面代码中,我们做了几件事情
注册storetouch store/configureStore.js 内容如下 import { createStore,applyMiddleware } from 'redux' import thunk from 'redux-thunk' import reducer from '../reducers' //applyMiddleware来自redux可以包装 store 的dispatch //thunk作用是使action创建函数可以返回一个function代替一个action对象 const createStoreWithMiddleware = applyMiddleware( thunk )(createStore) export default function configreStore(initialStare){ const store = createStoreWithMiddleware(reducer,initialStare) //热替换选项 if(module.hot){ module.hot.accept('../reducers',()=>{ const nextReducer = require('../reducers') store.replaceReducer(nextReducer) }) } return store } 新建组件touch components/Douban.js 在components目录下新建Douban.js组件文件,内容如下 import React from 'react'; export default React.createClass({ render(){ const {title,list,click} = this.props //从组件的props属性中导入两个变量和一个方法 let listHtml = list.map(function(item){ return (<li key={item.id}>{item.title}</li>) }); return ( <div> <h1>{title}</h1> <ul> {listHtml} </ul> <button onClick={click}>获取数据</button> </div> ) } }) 上面的代码建立了一个组件,组件的内容是一个标题和一个ul列表,从组件的props属性中导入了两个变量和一个方法。 新建容器文件touch containers/Douban.js 在容器目录新建了Douban.js文件,内容如下 import { bindActionCreators } from 'redux' import { connect } from 'react-redux' import Douban from '../components/Douban' import * as DoubanAction from '../actions/doubanAction' //将state.douban 绑定到props.douban function mapStateToProps(state){ return { douban:state.douban } } //将DoubanAction的所有方法绑定到props上 function mapDispatchToProps(dispatch){ return bindActionCreators(DoubanAction,dispatch) } //通过react-redux提供的connect方法将我们需要的state中的数据和actions中的方法绑定到props上 export default connect(mapStateToProps,mapDispatchToProps)(Douban) 上面代码我们干了两件事:
新建actiontouch actions/douban.js 内容如下 export const DOUBAN_TOP250 = 'DOUBAN_TOP250' export function douban_list(title='',list=[]){ return { type:DOUBAN_TOP250,title:title,list:list } } //将action的方法绑定到props上 export function getDoubanTop250(){ return (dispatch) => { $.getJSON("https://api.douban.com/v2/movie/top250?callback=?",function(result){ dispatch(douban_list(result.title,result.subjects)) }) } } //这些方法都导出,在其他文件导入的时候,使用import * as actions就可以生成一个actions对象包含所有的export action负责运算,通知reducer更新state。 新建reducertouch reducers/douban.js 内容如下 import {DOUBAN_TOP250} from '../actions/douban' export default function douban(state={title:'',list:[]},action){ switch (action.type){ case DOUBAN_TOP250: return {title:action.title,list:action.list} default: return state } } reducer其实是个方法,参数state和action,返回值是新的state,reducer只负责赋值,actions负责运算 新建reducer打包导出文件在项目中我们会建立多个reducer文件,所有我们需要一个文件把所有的reducer文件打包导出 touch reducers/index.js 内容如下 import { combineReducers } from 'redux' import douban from './douban' const rootReducer = combineReducers({ douban }) export default rootReducer 上面代码中,我们使用redux的combineReducers方法将所有的reducer打包起来导出 相关文档https://lewis617.github.io/2016/01/19/r2-counter/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |