概述

之前看redux官方文档真是看得一脸懵逼,现在自认为会用了,于是来总结一下用法,供以后开发时参考,相信对其他人也有用。

不得不说,用了redux之后感觉挺爽的,有如下优点:

  1. 组件大多是函数组件非常方便测试
  2. 免去了一层层传递props的困扰,如果想要数据,直接建一个容器组件即可,不需要对原组件做任何改动。
  3. 扩展性很强,有新动作的时候,只需在action.js里面添加,然后在reducer.js里面注册即可。

index.js

首先把index.js改成下面这个样子,用一个有store属性的Provider包裹。

import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import { createStore } from 'redux'
import todoApp from './reducers'
import App from './components/App'

const store = createStore(todoApp)

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

注意:以后添加路由,redux-thunk的时候也是在这里改。当规模大了的时候会独立出去一个root.js组件。

action.js

然后当然是注册动作了。

//有参数的动作
export const ADD_TODO = 'ADD_TODO'
export function addTodo(text) {
return { type: ADD_TODO, id: todoId++, text}
} //没有参数的动作
export const SHOW_ALL = 'SHOW_ALL'
export function showAll() {
return { type: SHOW_ALL }
}

动作其实就是指令,告诉redux我需要进行某种改变。一般是没有参数的动作,不需要传递数据给store,另外一种是传递参数的动作,需要传递数据给store。

这里涉及到redux的一种理念,就是ui的改变不是通过各组件用它们的方法各自处理数据进行改变的,而是通过store处理数据,然后组件只负责渲染即可。这就是react是声明式框架而不是命令式框架的原因(各组件只是一种声明,并没有命令)。

reducer.js

注册动作之后,我们就有了指令了,但是store接收到了指令之后要怎么做?这就是reducer.js的功劳了。一般的reducer是类似下面这个样子的:

const post = (state = '无数据', action) => {
switch(action.type) {
case RECEIVE_POSTS:
return action.title
case RECEIVE_ING:
return action.text
case RECEIVE_ERROR:
return action.error
default:
return state
}
}

它有如下特点:

  1. 一个state的初始值。
  2. 一个switch处理action。
  3. 通过处理带参数或者不带参数的action,返回新的state。

store这个层面上来说,经过了reducer之后,里面的数据得到了更新,做出了响应,它的任务全部完成了。但是从组件这个层面来说,它却又要处理这3个问题:

  1. 它如何拿到store里面的数据。
  2. 它如何发出指令(action)。
  3. store数据的改变怎么导致它的重新渲染。

这三个问题利用容器可以解决。

container.js

容器就是组件和store之间的中介。为什么需要容器?因为关注点分离的思想,在组件层面,我们只关注怎么渲染的,在容器层面,我们只关注数据怎么传递的。

一般的容器需要拿到store的数据,并且发出指令(action),下面的一个一般的容器的写法:

const mapStateToProps = state => ({
list: state
}) const mapDispatchToProps = dispatch => ({
toggleState: (id) => dispatch(toggleState(id))
}) export default connect(
mapStateToProps,
mapDispatchToProps
)(TodoList)

这样,我们就解决了前2个问题。然后,由于我们把store里面的数据通过props传递给了组件,所以如果state的相关数据更新的话,传递给组件的props也会更新,于是组件重新渲染,这就解决了第三个问题。

有时候,我们并不需要传递store里面的数据进来,只需要发布几个命令即可,这个时候只需要把mapStateToProps换成null即可,示例如下:

const mapDispatchToProps = dispatch => ({
addTodo: (text) => dispatch(addTodo(text))
}) export default connect(
null,
mapDispatchToProps
)(AddTodo)

组件

组件可以不作任何改动,只改成箭头函数就行了。如下所示:

import React from 'react'

const Posts = ({ title, nextText, nextPost }) => {
return (
<div>
<span>{ title }</span>
<button
onClick={() => {
nextText();
nextPost();
}}> next </button>
</div>
)
} export default Posts

如何使用react-redux——傻瓜版的更多相关文章

  1. React+Redux实现追书神器网页版

    引言 由于现在做的react-native项目没有使用到redux等框架,写了一段时间想深入学习react,有个想法想做个demo练手下,那时候其实还没想好要做哪一个类型的,也看了些动漫的,小说阅读, ...

  2. react+redux教程(四)undo、devtools、router

    上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...

  3. 【原】react+redux实战

    摘要:因为最近搞懂了redux的异步操作,所以觉得可以用react+redux来做一个小小的项目了,以此来加深一下印象.切记,是小小的项目,所以项目肯定是比较简单的啦,哈哈. 项目效果图如图所示:(因 ...

  4. react 后台(一) react + redux + react-route + webpack+ axios + antd + less

    create-react-app 项目名称(项目失败,ant 的样式出不来) 项目技术栈 react + redux + react-route + webpack+ axios + less + a ...

  5. React Redux 与胖虎

    这是一篇详尽的 React Redux 扫盲文. 对 React Redux 已经比较熟悉的同学可以直接看 <React Redux 与胖虎他妈>. 是什么 React Redux 是 R ...

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

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

  7. react+redux教程(六)redux服务端渲染流程

    今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...

  8. react+redux教程(五)异步、单一state树结构、componentWillReceiveProps

    今天,我们要讲解的是异步.单一state树结构.componentWillReceiveProps这三个知识点. 例子 这个例子是官方的例子,主要是从Reddit中请求新闻列表来显示,可以切换reac ...

  9. react+redux官方实例TODO从最简单的入门(6)-- 完结

    通过实现了增-->删-->改-->查,对react结合redux的机制差不多已经了解,那么把剩下的功能一起完成吧 全选 1.声明状态,这个是全选状态 2.action约定 3.red ...

  10. react+redux官方实例TODO从最简单的入门(1)-- 前言

    刚进公司的时候,一点react不会,有一个需求要改,重构页面!!!完全懵逼,一点不知道怎么办!然后就去官方文档,花了一周时间,就纯react实现了页面重构,总体来说,react还是比较简单的,由于当初 ...

随机推荐

  1. 29.Hibernate-二级缓存和session管理.md

    目录 1.概念 1.1一级缓存: 1.2二级缓存: 2.使用方法 3.策略 3.1缓存策略 3.2集合缓存 3.3查询缓存 5. Seesion管理 1.概念 Hibernate提供的缓存 有一级缓存 ...

  2. Mybatis控制台打印sql

    mybatis-config.xml配置如下: <configuration> <settings> <setting name="lazyLoadingEna ...

  3. POJ-1797.HeavyTransportation(最长路中的最小权值)

    本题思路:最短路变形,改变松弛方式即可,dist存的是源结点到当前结点的最长路的最小权值. 参考代码: #include <cstdio> #include <cstring> ...

  4. Django的rest_framework的分页组件源码分析

    前言: 分页大家应该都很清楚,今天我来给大家做一下Django的rest_framework的分页组件的分析:我的讲解的思路是这样的,分别使用APIview的视图类和基于ModelViewSet的视图 ...

  5. jquery中bind和on的区别

    1.首先,来看看bind和on的语法. bind的用法: $('a').bind('click',[data],function(){}) 其事件的绑定者是固定的,就是a,第一个参数是事件,第二个参数 ...

  6. java_22 Map接口

    1Map Collection是孤立存在的,向集合中存储元素是一个一个放进去的 Map中的集合存储是成对的,可以通过键找到值.即将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值 ...

  7. IIS上配置单页面404

    问题 因为我们的应用是单页客户端应用,当用户在浏览器直接访问http://www.xxx.com/user时,刷新页面的时候,会返回404错误. 问题原因 服务端URL匹配不到相应的路由资源 解决方案 ...

  8. node.js中express的Router路由的使用

    express中的Router作用就是为了方便我们更好的根据路由去分模块.避免将所有路由都写在入口文件中. 一.简单的使用Router const express = require('express ...

  9. 正则RegExp的懒惰性和贪婪性; 分组捕获;

    1.正则的懒惰性??? 每次在它的方法exec中捕获的时候,只捕获第一次匹配的内容,而不往下捕获,我们把这种情况称为正则的懒惰性 且每一次捕获的位置都是从索引0开始 正则的实例对象上有一个lastin ...

  10. python 包和模块

    一. 模块 使用内置函数vars()可以查看当前环境下有哪些对象(变量.函数.类) from 模块 import *: 不会导入以下划线开头的对象 只会导入__all__中定义了的对象(__all__ ...