why redux?

  • 随着 JavaScript 单页应用开发日趋复杂,管理不断变化的 state 非常困难
  • Redux的出现就是为了解决state里的数据问题
  • 在React中,数据在组件中是单向流动的
  • 数据从一个方向父组件流向子组件(通过props),由于这个特征,两个非父子关系的组件(或者称作兄弟组件)之间的通信比较麻烦

what is redux?

工作流

设计思想

  • Redux是将整个应用状态存储到到一个地方,称为store
  • store里面保存一棵状态树(state tree)
  • 组件可以派发(dispatch)行为(action)给store,而不是直接通知其它组件
  • 其它组件可以通过订阅store中的状态(state)来刷新自己的视图.

三大原则

  • 整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中 State 是只读的,惟一改变 state 的方法就是触发 action,
  • action是一个用于描述已发生事件的普通对象 使用纯函数来执行修改,为了描述action如何改变state tree ,你需要编写 reducers
  • 单一数据源的设计让React的组件之间的通信更加方便,同时也便于状态的统一管理

how redux?

1.安装

npm i redux -S
复制代码

2.简单例子

1.引入

import {createStore} from 'redux';
//createStore 用来创建状态仓库
复制代码

2.创建state

let initState = {title: 'star'
}
复制代码

3.创建reducer

const CHANGETITLE = 'CHANGETITLE'; //action-todos
function reducer(state= initState, action){switch(action.type){case CHANGETITLE: return state.title = action.title;}}
复制代码

4.创建仓库

let store = createStore(reducer);
复制代码

5.触发dispatch中传入action

store.dispatch({type: CHANGETITLE, title: 'xingxing'})
复制代码

完整代码

import {createStore} from 'redux';
const CHANGETITLE = 'CHANGETITLE';
function reducer(state= initState, action){switch(action.type){case CHANGETITLE: state.title = action.title;}console.log(state);
}
let store = createStore(reducer);
store.subscribe(()=>{                    //订阅事件,在dispatch时触发console.log('render');
})
store.dispatch({type: CHANGETITLE, title: 'xingxing'})
复制代码

复杂些例子

在真实开发中需要开辟一个文件空间来管理仓库

  • 文件结构化
  • 多reducer,合并reducer

1.actions

action-type.js
//action-type衡量,通过引入使用,减少拼写错误引发的问题
export const INCREMENT = 'INCREMENT'
export const DECREMNET = 'DECREMNET'
复制代码
actions/count.js
import * as types from "../action-types"
//用于生成action
let counter = {add(n){return {type: types.INCREMENT, count: n}}
}
export default counter
复制代码

2.reducers

reducers/count.js
import {INCREMENT,DECREMENT} from '../actions/action-type'
let initState = {count: 0
}
function reducer(state = initState,action){switch(action.type){case INCREMENT:state.count = state.count + action.number;break;case DECREMENT:state.count = state.count - action.number;break;}return state
}
export default reducer
复制代码
合并reducer
reducers/index.js
import todos from './todo';
import count from './count';
import {combineReducers} from 'redux'
let reducers = combineReducers({todos,count
})
export default reducers;
复制代码

store/index.js 初始化仓库

import {INCEMENT,DECREMENT} from './actions/action-type';
import {createStore} from 'redux';
import reducers from './reducers'export default createStore(reducers);
复制代码

how is redux work?

  • redux的数据源是创建reducer时,传进去的initState。
  • 为了避免state被随意篡改,redux通过dispatch reducer来更改数据。
  • redux可以通过subscribe订阅状态修改事件
//简单实现
function createStore(reducer){let state;let listeners = [];function subscribe(listener){listeners.push(listener);return ()=> listeners = listeners.filter(fn=>fn!==listener);}function dispatch(action){listeners.forEach(listener=>listener());reducer(state, action)}dispatch({})function getState(){return state;}return {subscribe, dispatch, getState}
}
复制代码

合并reducer

function combineReducers(reducers){return (state={},action)=>{let newState = {};for(let key in reducers){let s = reducers[key](state[key],action);newState[key] = s;}return newState;}
}
复制代码

完整代码

function createStore(reducer){let state;let listeners = [];function subscribe(listener){listeners.push(listener);return ()=>{listeners = listeners.filter(l=> l!==listener)}}dispatch({})function dispatch(action){state = reducer(state,action);listeners.forEach(l=>l());}function getState(){return state;}return {subscribe,dispatch,getState};
}function combineReducers(reducers){return (state={},action)=>{let newState = {};for(let key in reducers){let s = reducers[key](state[key],action);  newState[key] = s;}return newState;}
}export {createStore,combineReducers}
复制代码

最近在研究redux,欢迎指出问题。后续更新react-redux全家桶系列研究

再厉害的魔术也比不上真正的redux相关推荐

  1. excel数据库_Excel再厉害的高手,也敌不过Access数据库的新手

    ​最近推广Access技术,没少被关注,但不少朋友都发出疑问:我这活明明用Excel干的不错,你偏偏要让我升级成Access做甚?你到底懂不懂Excel函数?布拉布拉的- 1.把Excel玩脱了没什么 ...

  2. 字母预言卡里的魔术与数学(二)——魔术背后的建模思路

    爱学习,勤思考:学数学,玩魔术.欢迎点击头部蓝字关注MatheMagician,这里有你要的奇迹! 在上一期的文章中,我们分析了<字母预言卡>这个魔术的表演改进方式以及其中的一些思考,感兴 ...

  3. 某程序员毕业进UC,被阿里收购!跳去优酷土豆,又被阿里收购!再跳去饿了么,还被阿里收购!难道阿里想收购的是他?...

    你羡慕过杨超越的锦鲤命吗?没想到互联网行业里也有一种奇特的命格,叫"阿里命".有位网友发帖自嘲自己"三次躺着进阿里","被动福报",小编太好 ...

  4. 【顶】(与同事合作的快乐)技术人员也需要先学会做人,再学会做事,再是能成事,最后是成名得利...

    为什么80%的码农都做不了架构师?>>>    单点登录.权限体统其实与 开发语言的是无关的.与开发架构的也是无关的.都可以接入进去的,主要是为了管理上的需求,防患后期的维护.改进成 ...

  5. 超级计算机 人脑,世界第4超级计算机竟被人脑秒成渣,人类的大脑究竟多厉害?...

    在我们的认知中,计算器的计算能力都要比我们快得多,更别说计算机,甚至是超级计算机了,特别是近年来,伴随着人工智能领域的不断发展,很多人都开始担心,未来人工智能会取代人类,成为地球的新主人,特别是霍金生 ...

  6. 哈登独得40分保罗复出 火箭主场103:98复仇魔术

    保罗在本场比赛迎来复出. 中新网北京1月28日电 北京时间28日,NBA常规赛继续展开争夺,火箭队在主场迎来魔术队的挑战,本场比赛火箭后卫保罗迎来复出.最终凭借哈登独得40分的表现,火箭在主场103: ...

  7. 团队从小到大,再到体验团队

    团队是"有着共同目标的一群人".团队从是由小到大的一个发展过程,什么是好的团队? 先上个例子,回顾计算机的发展史,计算机从只能进行简单的数学计算,到家庭媒体中心.现在,不管是台式电 ...

  8. 【顶】(与同事合作的快乐)技术人员也需要先学会做人,再学会做事,再是能成事,最后是成名得利

    单点登录.权限体统其实与 开发语言的是无关的.与开发架构的也是无关的.都可以接入进去的,主要是为了管理上的需求,防患后期的维护.改进成本为目的的. 最近公司的一个小项目的实施,让我充分感受到合作的快乐 ...

  9. 既然都有了NS,何不再入一个喷喷(Splatoon 2)【下】

    上一篇说到,作为一个硬核玩家对抗射击游戏,喷射却营造了一个友好温暖没有祖安话的玩家社区.嘴臭大家都知道是怎么回事,那其实让玩家不要嘴臭的诀窍很简单: 不会好好说话就不要说 是的,在喷喷的世界里,没有语 ...

最新文章

  1. Spring源代码解析(十):Spring Acegi框架授权的实现
  2. OVS DPDK--Ring端口配置(五)
  3. Open quote is expected for attribute {1} associated with an element type name.
  4. 【图像分类】 基于Pytorch的细粒度图像分类实战
  5. 中石油训练赛 - 小A进学校(唯一分解定理)
  6. 25个实用编程小技巧
  7. apache rewrite 二级域名
  8. 程序员必须知道的HTML常用代码有哪些?
  9. macOS 系统重大安全漏洞:不用密码我也可以玩你的 Macbook
  10. 计算机组成原理——存储器容量扩充
  11. 5学工坊整理|关于大数据发展趋势
  12. excel在线_图片转Excel表格在线工具,分享几款不错的工具
  13. php getdigest,http digest
  14. 晶体三极管及其基本放大电路之共发射极电路
  15. 2022年中国互联网数据中心(IDC)行业产业链及市场现状分析(附国家绿色数据中心公示名单)[图]
  16. 自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)
  17. Java: 数组、列表和集合的互相转换
  18. Redis第一讲:相关的基础知识/数据类型/缓存的过期策略/双写一致性/内存存储和持久化
  19. Miranda显IP和显QQ版本号
  20. 一种简单快速有效的图像暗部增强/亮度均衡算法

热门文章

  1. 【原】unity3D ios 退出保存数据(2)
  2. 最简单的moss单点登录第三方系统,有点非主流
  3. c# combobox集合数据不显示_Excel也能玩转百万数据
  4. webform中提交按钮同时执行更新和插入操作_软件测试中的功能测试点(三)
  5. c++ linux 环境,C++ 环境设置
  6. 帕累托最优生活例子_创业者:用博弈解决生活的难题
  7. js splice方法_我用JS刷LeetCode | Day 8
  8. python下载文件暂停恢复_selenium+Python如何取消Chrome下载文件的‘保留’‘放弃’提示?...
  9. matlab火焰测温源程序,一种火焰测温方法与流程
  10. 深度优化LNMP之Nginx [2]