上一篇展示了Redux的基本使用,可以看到Redux非常简单易用,不限于React,也可以在Angular、Vue等框架中使用,只要需要Redux的设计思想的地方,就可以使用它。

这篇主要讲解在React中使用Redux,首先是安装。

安装React Redux

yarn add redux
yarn add react-redux

有两个概念:

1.容器组件(Container Components)

2.展示组件(Presentational Components)

展示组件

  • 更关注数据展示,所以会写一些DOM嵌套和CSS
  • 通常不依赖Redux,直接从props中获取数据
  • 通常没有state,偶尔会用state来保存一些展示状态,如class等
  • 交互也通过props回调发起,不直接发起action

容器组件

  • 通常作为数据源,做数据分发工作
  • 依赖Redux
  • 通过和store交互进行数据变更
  • 通过react-redux生成

在我们的项目中,一般来说,会编写很多展示组件,少量的容器组件来包裹这些展示组件。

接下来写一个简单的计数器应用,先来划分容器组件和展示组件。

计数器有三个按钮,加、减、重置;一个展示区。

由于按钮既要触发action,又要负责展示,所以需要做成混合组件。

先来编写展示组件,就是显示一下当前计数。

import React from 'react';
const Counter = ({
count
}) => (
<p>当前计数为:<span style={{color: 'red'}}>count</span></p>
) export default Counter;

一般来说,容器组件就是通过store.subscribe传入回调,订阅store的变化,再去把值通过props传入各个组件中。

在react-redux中实现了connect方法,它生成一个高阶组件,就是前面提到的容器组件。这个方法做了性能优化避免不必要的重复渲染,建议使用该方法。

connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])

mapStateToProps是一个Function,用来监听Redux Store的变化,将store的值,映射为对应的props属性。

const mapStateToProps = ({count}) => {count};
// 或者
const mapStateToProps2 = (state) => {
count: state.count
}

接下来生成一个容器组件。

import { connect } from 'react-redux';

const ConnectCounter = connect(
mapStateToProps
)(Counter); export default ConnectCounter;

接下来是按钮组件,按钮组件既需要展示,又有数据交互,做成混合组件。

由于,需要dispatch,所以需要给connect传入第二个参数。

mapDispatchToProps可以是Object或者Function。用来将dispatch映射到props上。

const mapDispatchToProps = dispatch => {
return {
plus: () => dispatch({
type: 'PLUS'
})
}
}
// 或者结合上篇提到的bindActionCreators合成一个对象
function plus() {
return {
type: "PLUS"
};
} function minus() {
return {
type: "MINUS"
};
} const mapDispatchToProps2 = dispatch => {
return bindActionCreators({ plus, minus }, dispatch)
}
import React from 'react';

let Button = ({plus, minus}) => {
return (
<>
<button onClick={plus}>{'plus'}</button>
<button onClick={minus}>{'minus'}</button>
</>
)
}; Button = connect(()=>{}, mapDispatchToProps2)(Button);
export default Button;

最后,提供一个Provider用来提供全局store。完整例子在这里-codesandbox

感谢阅读。

最新文章

  1. Visual Studio Enterprise 2015下载 Update3
  2. LAMP之安装mysql/apache/php
  3. Page 16 Exercises 1.2.3 -------Introduction to Software Testing (Paul Ammann and Jeff Offutt)
  4. iOS数据持久化(二)SQLite
  5. [改善Java代码]推荐使用String直接量赋值
  6. 游戏开发之在UE4中编写C++代码控制角色
  7. 关于echarts使用的常见问题总结
  8. 51nod--1006 最长公共子序列Lcs (动态规划)
  9. &lt;a&gt; 标签详解
  10. UEditor富文本简单使用
  11. Linux gzip命令
  12. tape ——cf
  13. 在Win10 Anaconda中安装Tensorflow
  14. 使用JavaMail发送邮件-从FTP读取图片并添加到邮件正文发送
  15. 001_a记录和canme的区别
  16. CSS三:CSS的三种引入方式
  17. CDH搭建Hadoop集群(Centos7)
  18. springMVC参数传递实例
  19. XML系列之--对电文格式XML的简单操作(三)
  20. TMG阵列部署选择

热门文章

  1. laravel JWT Auth - JSON Web令牌认证API
  2. 佛系结对编程---四则运算(Core 第四组)
  3. Android Studio最新稳定版下载 - 百度网盘(更新于2017年7月14日)
  4. WebRequest的get及post提交
  5. Javascript 删除tr 元素
  6. WPF DatePicker日期控件只显示年月
  7. mongodb 启动
  8. 华为HCNP实验 防火墙安全区域及安全策略配置(USG6000)
  9. 一个典型的后台软件系统的设计复盘——(三)打通任督二脉-context
  10. Spark Broadcast内幕解密:Broadcast运行机制彻底解密、Broadcast源码解析、Broadcast最佳实践