一、安装相关包

  

  1. npm install redux react-redux --save

  

二、根据具体情形创建模块文件

  Store.js、Reducer.js、Actions.js

  Store.js的作用在于引出store,方便在使用的时候引入。

  Reducer.js的作用在于定义reducer,最好用combineReducers拆分reducer。

  Actions.js用于定义ActionCreator,方便在dispatch action的时候根据不同变量生成不同action。

三、使用Provider组件以便于所有组件都能直接使用store

  在使用根组件(通常是入口文件index.js)处引入Provider组件。

  在index.js中引入store,

  在ReactDOM.render()方法的第一个参数处使用Provider包裹根组件,

  然后给Provider组件的store属性赋值为之前引入的store。

  

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './index.css';
  4. import App from './App';
  5. import registerServiceWorker from './registerServiceWorker';
  6. import { Provider } from 'react-redux';
  7. import store from './Store';
  8.  
  9. ReactDOM.render(<Provider store={store}>
  10. <App />
  11. </Provider>, document.getElementById('root'));
  12. registerServiceWorker();

  

四、编写子组件

  先写UI Component,即通常所写的普通组件;

  然后定义Container Component,使用connect方法(从react-redux包中引入)即可将UI Component转化为Container Component。

  注意要传递mapStateToProps、mapDispatchToProps两个参数。

最后导出组件以便于使用的时候引入。

  

  1. import React from 'react';
  2. import { connect } from 'react-redux';
  3. import { toggleItemAction, removeItemAction } from './Reducer';
  4.  
  5. class Display extends React.Component {
  6. componentWillMount(){
  7. this.toggleCompleted = this.props.toggleCompleted;
  8. this.removeItem = this.props.removeItem;
  9. console.log(this.props);
  10. }
  11. render(){
  12. return <div>
  13. <ul>
  14. {
  15. this.props.items.map(item => {
  16. let tmp = null;
  17. if(item.completed){
  18. tmp = <del>{item.value}</del>
  19. }
  20. else {
  21. tmp = item.value;
  22. }
  23. if(tmp === null || tmp ===''){
  24. return null;
  25. }
  26. return <li key={item.id}>
  27. {tmp}
  28. <button id={'toggle' + item.id} onClick={this.toggleCompleted}>Toggle</button>
  29. <button id={'remove' + item.id} onClick={this.removeItem}>Remove</button>
  30. </li>
  31. })
  32. }
  33. </ul>
  34. </div>
  35. }
  36. }
  37.  
  38. const mapStateToProps = (state) => {
  39. return {
  40. items: state.items
  41. };
  42. };
  43.  
  44. const mapDispatchToProps = (dispatch) => {
  45. return {
  46. toggleCompleted(e){
  47. let id = e.target.id.substring(6);
  48. dispatch(toggleItemAction(id));
  49. },
  50. removeItem(e){
  51. let id = e.target.id.substring(6);
  52. dispatch(removeItemAction(id));
  53. }
  54. };
  55. };
  56.  
  57. const DisplayContainer = connect(mapStateToProps, mapDispatchToProps)(Display);
  58.  
  59. export default DisplayContainer;

  

五、注意点

  1.mapStateToProps参数其实是一个函数,默认带有一个参数为state,作用是将state中的值映射到我们定义的组件的props属性中。

   一下定义一个mapStateToProps:

    

  1. const mapStateToProps = (state) => {
  2. return {
  3. items: state.items
  4. };
  5. };

  这样的话,在组件中就可以通过this.props.items获取到state.items。

  mapStateToProps函数所返回的对象可以认为是组件props属性的一个子集。

  2.mapDispatchToProps参数是一个对象或者函数,我习惯于写成一个函数,函数具有一个默认属性即为dispatch,相当于store.dispatch(),mapDispatchToProps函数会返回一          个对象。对象中的所有方法都会传递给组件的props属性。也可以认为它所返回的对象是组件props属性的一个子集。

  1. const mapDispatchToProps = (dispatch) => {
  2. return {
  3. toggleCompleted(e){
  4. let id = e.target.id.substring(6);
  5. dispatch(toggleItemAction(id));
  6. },
  7. removeItem(e){
  8. let id = e.target.id.substring(6);
  9. dispatch(removeItemAction(id));
  10. }
  11. };
  12. };

  以上代码定义了一个mapDispatchToProps函数,这样,在组件内部可以通过this.props[propertyName]访问到toggleCompleted函数或者removeItem函数。

  3.如何在mapDispatchToProps函数定义的一系列函数中获取组件内部数据?

  解决方法有两种:

  (1)通过event.target来获取事件发生节点,然后通过DOM属性获取组件内部的数据。注意点2中的代码即是例子。

  (2)在组件内部定义事件处理函数,不直接利用this.props[propertyName]来处理组件事件。组件内部自定义事件处理函数可以通过this等获取到组件内部数据,然后在组件自定义事件处理函数内部调用this.props[propertyName],传递参数即可。

  4.是否需要使用react-redux

  react-redux是redux的作者为了方便于在React中使用redux而开发出来的。

  react-redux为我们在react项目中使用redux带来了便利,但也提升了学习成本,我们需要学习一些新的API,并且遵循react-redux的开发及组件拆分规范。

  如果你因为单纯的在项目中使用redux需要不断地引入store,不断地写store.[propertyName]而感到厌烦,那么可以尝试使用react-redux。

  如果你认为使用redux十分方便简洁明了,那么可能并不需要使用react-redux。

使用react-redux开发的简单步骤的更多相关文章

  1. 使用redux开发的简单步骤

    一.安装redux包 npm install redux --save 二.根据APP数据结构或者后台请求的数据结构拟定state的大致结构. 可以把state写成一个对象字面量,放在reducer文 ...

  2. React+Redux开发实战项目【美团App】,没你想的那么难

    README.md 前言 开始学习React的时候,在网上找了一些文章,读了官网的一些文档,后来觉得React上手还是蛮简单的, 然后就在网上找了一个React实战的练手项目,个人学完之后觉得这个项目 ...

  3. react+redux开发谷歌插件

    React Developer Tools Redux Dev Tools

  4. react打包开发文件的步骤(上传给线上环境)

    cd进入ReleaseProject目录,然后运行npm start,系统会自动在public目录下面完成打包工作,然后我再把  public文件下压缩位public.rar上传即可:(public文 ...

  5. 实例讲解基于 React+Redux 的前端开发流程

    原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...

  6. React+Redux学习笔记:React+Redux简易开发步骤

    前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...

  7. webpack+react+redux+es6开发模式

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  8. angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”

    曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂.作为一个angular开发者,我来吐槽一下react+redux的复杂. 例子 为了让大家看得舒服,我用最简单的一个demo来展示r ...

  9. webpack+react+redux+es6开发模式---续

    一.前言 之前介绍了webpack+react+redux+es6开发模式 ,这个项目对于一个独立的功能节点来说是没有问题的.假如伴随着源源不断的需求,前段项目会涌现出更多的功能节点,需要独立部署运行 ...

随机推荐

  1. 以cmd命令行方式执行php文件时,传递参数

    1. php自带的两个参数$argc, $argv: 1.1. $argv : (后面的v是variables的意思),传递进来的参数会以数组的方式保持在这个变量里 1.2. $argc : (后面的 ...

  2. Cocos2dx v3.9项目位置和基本操作

    MainScene.lua 在Mydemo\src\app\views下 官方示例 cocos2d-win32.sln在cocos2d-x-3.9\build下 生成项目 -l指定语言,-d指定路径 ...

  3. url模块学习小结

    url模块是node自带的功能强大的url解析库. var url = require("url"); var str = "http://192.168.0.109:8 ...

  4. 【转】WEB安全之渗透测试流程

    熟悉渗透流程,攻击会像摆积木一样简单! 0x 01:信息收集 收集网站信息对渗透测试非常重要,收集到的信息往往会让你在渗透中获得意外惊喜. 1. 网站结构 可以使用扫描工具扫描目录,主要扫出网站管理员 ...

  5. 【转】XDocument简单入门

    1.什么是XML? 2.XDocument和XmlDocument的区别? 3.XDocument 4.XmlDocument 5.LINQ to XML 6.XML序列化与反序列化 因为这几天用到了 ...

  6. Asp.NET MVC4 + Ajax 实现多文件上传

    本文转自http://www.cnblogs.com/freeliver54/archive/2013/05/15/3079700.html JS部分测试可以,jQuery部分没有测试先留着 HTML ...

  7. DataGridView初始化,加载数据

    1,创建winform窗体应用程序 2,在界面上拖入DataGridView控件 3,添加相应的列如图: 4,开始编写后面的代码: private DataTable CountryDt = new ...

  8. tomcat启动编码等部署遇到问题

    版权声明:本文为博主原创文章,转载请注明文章链接.https://blog.csdn.net/xiaoanzi123/article/details/58254318 2017-02-27 21:01 ...

  9. C#学习笔记15

    1.平台互操作性和不安全的代码:C#功能强大,但有些时候,它的表现仍然有些“力不从心”,所以我们只能摒弃它所提供的所有安全性,转而退回到内存地址和指针的世界. C#通过3种方式对此提供支持. (1)第 ...

  10. Java CAS总结

    文章目录 1. CPU指令对CAS的支持(CPU的cas指令是原子的) 或许我们可能会有这样的疑问,假设存在多个线程执行CAS操作并且CAS的步骤很多,有没有可能在判断V和E相同后,正要赋值时,切换了 ...