前言

React+Redux 分为两部分:

    1. UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM
    2. 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文章:Redux学习笔记:Redux简易开发步骤

而React+Redux是以上两部分结合起来,方便在React中使用Redux,专用库为React-Redux.js。
React-Redux.js新增了一些新方法:

    1. Provider:容器跟组件,可直接把外部的state传递给所有子组件和UI组件;
    2. mapStateToProps:输入逻辑,把外部的state转化为props对象传递给用户自定义UI组件;
    3. mapDispatchToProps:输出逻辑,根据用户的操作,处理具体Action,并通过dispatch触发更新state;
    4. connect:根据UI组件、输入逻辑、输出逻辑生成容器组件;

源代码

本文实例源代码参考:React-Redux-Primary-Demo 中的webapp/redux/index2.js。

演示地址React-Redux实例演示

具体开发步骤

1.创建主文件js,比如index.js

2.定义Render入口,即容器组件

    ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)

说明:<Provider>是包裹在所有容器外面的根组件,目的是可以直接传递state给所有子组件。(利用React组件的context,可参考:React组件实现越级传递属性

3.connect根据UI组件生成容器组件,并定义输入(mapStateToProps)、输出(mapDispatchToProps)逻辑

    const App = connect(
mapStateToProps,
mapDispatchToProps
)(Counter)

说明:connect将用户自定义的UI组件(即Counter)和React-Redux自动生成的容器组件(即App)连起来,目的是:前者负责UI展示,后者负责逻辑处理。

4.定义用户自定义UI组件,即React Component

    class Counter extends Component {
render() {
const { value, onIncreaseClick } = this.props
return (
<div>
<span>{value}</span>
<button onClick={onIncreaseClick}>累加一次</button>
</div>
)
}
}

5.定义输入输出逻辑

    // 输入逻辑:
// 将state映射成props传递给UI组件(即Counter组件)
function mapStateToProps(state) {
return {
value: state.count
}
} // 输出逻辑:
// 将用户对UI组件的操作映射成Action,通过dispatch,触发reducer(即conter),生成新的state
function mapDispatchToProps(dispatch) {
return {
onIncreaseClick: () => dispatch({ type: 'increase' })
}
}

6.创建store,并绑定reducer

const store = createStore(counter); // createStore的第一个参数必须是个函数,mapDispatchToProps中执行dispatch()时,该函数就叫reducer

7.定义Reducer,生成新的state

    function counter(state = { count: 0 }, action) {
const count = state.count
switch (action.type) {
case 'increase':
return { count: count + 1 }
default:
return state
}
}

说明:state生成之后,会自动触发mapStateToProps,并渲染View,不需要subscribe监听state变化。

最新文章

  1. 不死僵尸木马lpt7.asp.asp与lpt5.cnzzz.asp的删除方法
  2. thunkify 模块
  3. 炮兵阵地 POJ 1185
  4. BSS Audio&#174; Introduces Full-Bandwidth Acoustic Echo Cancellation Algorithm for Soundweb London Conferencing Processors
  5. 再析在spring框架中解决多数据源的问题
  6. How To Use RUN_PRODUCT In Oracle Forms
  7. HTML与CSS入门——第十章 创建用于Web上的图像
  8. keil C 应注意的几个问题
  9. RESTful服务最佳实践
  10. poj-1005-l tanink i need a houseboat
  11. ●BZOJ 3551 [ONTAK2010]Peaks(在线)
  12. 运行SSIS包的六种方式
  13. python之Django学习笔记(一)---搭建Django开发环境和一些基本命令
  14. celery使用
  15. [代码笔记]VUE路由根据返回状态判断添加响应拦截器
  16. attr VS prop 区别
  17. a gcc 4.2.4 bug(被stos指令累加后%edi作为参数的)
  18. 虚拟机中安装centOS及破解nuke的方法
  19. WebBrowserのIEバージョンを最新にする。
  20. [译].Net 4.5 的五项强大新特性

热门文章

  1. Java面试09|多线程
  2. Macaca 自动化框架 [Python 系列]
  3. node c++多线程插件 第一天 c++线程相关函数
  4. SEO-友情链接注意事项
  5. hdoj1242(bfs+priority_queue)
  6. Mysql5.7服务下载安装
  7. PHP语言开发微信公众平台(订阅号)之开启开发者模式
  8. Mac本地编辑服务器代码
  9. web从入门开始(7)-----css
  10. vpn的实现原理