Redux的梳理
学习Redux之前,我了解了它需要去解决什么问题:
- 用户使用方式复杂
- 不同身份不同使用方式
- 多个用户可以协作
- 与服务器大量交互,或者使用websocket
- 视图数据从多个来源获取
- 共享组件状态
- 组件之间可以改变状态
Redux相比于的React特点是多交互,多数据源.根据文章,得出一句话:Redux应用具有唯一的Store,一个State对应一个View,View导致了State的变化,改变State的唯一方法是Action对象,store.dispatch()是View 发出 Action 的唯一方法.
- 生成Store的方法:import {createStore} from 'redux'; const store = createStore(fn);fn返回新生成的对象,如果createStore再给一个参数,那么第二个参数将会变成整个应用的状态初始值,并且会覆盖Reducer方法的默认初始值
- View发出Action的方法:store.dispatch();
- 调用Reducer的方法:const store = createStore(reducer);reducer的两个参数分别是state和anction
- 由于Reducer是纯函数,所以State不能任意改变,但是可以定义多个reducer从而得到多个不同的State,而且与View对应的State总是不变
- 监听State的方法:store.subscribe(listener); 相应解除监听的方法:unsubscribe();
Reducer方法负责生成State,由于整个应用只有一个State对象,所以可以使用Reducer方法拆分的形式,化整为零,然后各个方法处理完之后,再使用combineReducers方法将这些Reducer整合起来,有两种的书写形式:
1.非自定义名称
import {combineReducers} from 'redux';
const chat = combineReducers({
chat1,
chat2
})
2.自定义名称
import {combineReducers} from 'redux';
const chat = combineReducers({
a:A,
b:B
})
如果项目中使用的Reducer非常多,那么完全可以放入一个文件中,使用类似于以下代码的方式统一引入:
import {combineReducers} from 'redux';
import * as reducers from './path';
const reducer = combineReducers(reducers);
React + Redux依照作用分文件的形式:“actions”、“constants”、“reducers”、“containers” 以及 “components”
中间件的使用可以方便的添加流程功能,其实现主要在发出Action到Reducer之间,即重写store.dispatch()方法,以下代码是调用方式:
import {applyMiddleware,createStore} from 'redux'; import createLogger from 'redux-logger';//借用redux-logger组件 const logger = createLogger(); const store = createStore( reducer, //假设这里存在参数,那么就是上次所说的全局初始化状态initial_state applyMiddleware(logger) //需要注意的是,中间件参数是有次序要求的,一般logger是放在最后 );
异步操作出现出现的action也会相应的增多至三种,发送/成功/失败,同时必须重新对action的写法进行调整,也就是添加相应的状态和返回参数,如:{type:'fetch',status:'error',error:'err'}.除了action,state也是需要进行改写的,常用的是isFetching(数据抓取判断)和didInvalidate(数据是否过时).
在异步操作时,第一个action是同步触发的,那么第二个action只有通过异步的形式了,利用动作生成器Action Creator,将第一个动作执行完后的结果进行转换,转换为json格式,然后自动再次发出一个action.store.dispatch()的参数仅能够是对象的形式,因此不可以使用函数,可以通过redux-thunk中间件来实现参数使用函数,利用上面所说的applyMiddleware(thunk)的方式,前提肯定是需要import插件的.这是通过写Action Creator返回函数的方式,借助redux-thunk中间件改造dispatch实现异步方案;还可以通过redux-promise中间件改造dispatch,这时Action Creator返回的参数使用Promise对象,还有一种写法将Action对象的payload属性写成Promise对象.
React-Redux将所有的组件分为两大类:UI组件和容器组件,二者区别很明显,如果二者同时处于一个组件中的话,是容器组件包含UI组件.
- UI组件无状态,所有的数据都由this.props提供,不使用Redux的API
- 容器组件带有内部状态,负责管理数据
连接UI组件和容器组件的桥梁是connect()方法:
import {connect} from 'react-redux'; const VisibleTodoList = connect( mapStateToProps,//此函数返回一个对象,第一个参数为state,第二个参数代表容器组件的props对象 mapDispatchToProps //定义用户操作,可以是函数,也可以是对象,如果是函数,那么会得到dispatch和ownProps两个参数 )(TodoList);//connect的第一个参数是输入逻辑,它将state映射到props,第二个参数是输出逻辑,用户对UI的操作映射成Action
我在理解mapStateToProps和mapDispatchToProps时,借助这篇详细的文档所理解通的:http://www.imooc.com/qadetail/197244?lastmedia=1
在connect方法生成容器组件后,使用React-Redux的Provider组件获取state,工作原理是React组件的context属性,使用方法如下:
import { Provider } from 'react-redux'
import { createStore } from 'redux'
import reducer from './reducers'
import App from './components/App' let store = createStore(todoApp);
render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
Redux的梳理的更多相关文章
- 前端(十一):props、state及redux关系梳理
所谓状态机,是一种抽象的数据模型,是“事物发展的趋势”,其原理是事件驱动.广泛地讲,世界万物都是状态机. 一.状态机是一种抽象的数据模型 在react中,props和state都可以用来传递数据.这里 ...
- react+redux官方实例TODO从最简单的入门(1)-- 前言
刚进公司的时候,一点react不会,有一个需求要改,重构页面!!!完全懵逼,一点不知道怎么办!然后就去官方文档,花了一周时间,就纯react实现了页面重构,总体来说,react还是比较简单的,由于当初 ...
- Redux你的Angular 2应用--ngRx使用体验
Angular2和Rx的相关知识可以看我的Angular 2.0 从0到1系列第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2 ...
- redux入门指南
前言:大概一个月没有写博客了,这两天正好是周末,就写点东西来梳理下之前几个月的所写与所得; 大概两个月前,学习了一下 redux ,还是一点难度的,花了我一天的时间来搞明白他, 但是都没怎么记录,今天 ...
- Redux 介绍
本文主要是对 Redux 官方文档 的梳理以及自身对 Redux 的理解. 单页面应用的痛点 对于复杂的单页面应用,状态(state)管理非常重要.state 可能包括:服务端的响应数据.本地对响应数 ...
- redux源码图解:createStore 和 applyMiddleware
在研究 redux-saga时,发现自己对 redux middleware 不是太了解,因此,便决定先深入解读一下 redux 源码.跟大多数人一样,发现 redux源码 真的很精简,目录结构如下: ...
- redux源码学习笔记 - applyMiddleware
在创建store时,createStore(reducer, preloadedState, enhancer),除了reducer函数,初始状态,还可以传入enhancer.这个enhancer在c ...
- [React] 11 - Redux: redux
Ref: Redux中文文档 Ref: React 讀書會 - B團 - Level 19 Redux 深入淺出 Ref: React+Redux 分享會 Ruan Yifeng, Redux 架构: ...
- Redux 入门教程(一):基本用法
转自http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html(仅供个人学习使用) 首先明确一点, ...
随机推荐
- 开始一个django项目的流程
1.明确开发站点的主题,(即此站点的作用), 确定站点的各种功能,需求. 2.优先设计数据库. 数据库的设计要合理,不能想当然的设计,最好能够以表格的形式展现出来,避免以后遗忘,也避免内容的重复. 3 ...
- restful规范整理
restful的十条规范 restful一共有十条规范,但其并不是规定.可以不去遵守,是一种软件风格 1.API与客户端交互,通常使用https协议 2.域名:https://api.baidu.co ...
- 剑指Offer 11. 二进制中1的个数 (其他)
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目地址 https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040e ...
- IC卡触点释放时序
IC卡触点释放时序过程如下: 要点: 终端必须通过把RST置为低电平状态来启动释放时序: 在置RST为低电平之后VCC断电之前,终端必须将CLK和IO设定为低电平状态: 在置RST.CLK和IO为低电 ...
- 2018 vue前端面试题
1.active-class是哪个组件的属性?嵌套路由怎么定义?答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么获取传过来的动态参数? 答: ...
- jq 绑定事件和解绑事件
<!DOCTYPE html><html><head> <script src="http://cdn.static.runoob.com/libs ...
- js封装选项卡
<div class="forestcamp_box"> <img src="img/home_02.jpg" /> <div c ...
- Unity Shader 矩阵基本信息
基本信息 mul函数 mul函数,是表示矩阵M和向量V进行点乘,得到一个向量Z,这个向量Z就是对向量V进行矩阵变换后得到的值. HLSL的mul函数接受mul(V, M)或mul(M, V),要注意 ...
- 关于IE无法访问本机网络的问题
多次遇到IE无法访问本机站点的情况,比如架设了一个花生壳,所有人都可以访问,唯独本机不行(服务器),还需要把这个域名加入信任站点,这TMD什么情况.今天又遇到访问本地restful service,用 ...
- 装系统时 System clock uses UTC 问题
装系统也装了至少不下50次了,每次都是傻瓜一样的按照第一印象在弄,从未想过为啥,装到这里的时候,System clock uses UTC 勾不勾呢,每次都是百度,然后装完这一次下一次又忘了,这是没有 ...