Redux(上)

结合阮老师的技术博客,将自己吸收到的内容做了个整理:

曾经有人说过这样一句hua : 如果你不知道是否需要Redux,那就是不需要它。

从组建层面考虑,什么样子的需要redux;某个组件的状态需要共享,

某个状态需要在任何地方都可以拿到,

一个组件需要改变全局状态,

一个组件需要改变另一个组件的状态

一)Redux的设计思想 很重要

1)web应用是一个状态机,试图与状态是一一对应的

2)所有的状态,保存在一个对象里面(唯一数据源)

二)基本概念和 API

1、store

store就是保存数据的地方,你可以把它看成一个容器。整个应用只能有一个Store

Redux提供createStore这个函数,用来生成Store,import {createStore} from 'redux'

/创建一个reducer文件夹 并引入reducer

const store = createStore(reducer)

export default store

2、state

Store对象包含所有数据。如果想得到某个时点的数据,就要对 Store 生成快照。这种时点的数据集合,就叫做 State。

当前时刻的 State,可以通过store.getState()拿到。import { createStore } from 'redux';

const store = createStore(fn);

const state = store.getState();

Redux 规定, 一个 State 对应一个 View。只要 State 相同,View 就相同。你知道 State,就知道 View 是什么样,反之亦然。

3、Action

State 的变化,会导致 View 的变化。但是,用户接触不到 State,只能接触到 View。所以,State 的变化必须是 View 导致的。Action 就是 View 发出的通知,表示 State 应该要发生变化了。

Action 是一个对象。其中的type属性是必须的,表示 Action 的名称。其他属性可以自由设置,社区有一个规范可以参考。const action = {

type: 'ADD_TODO',

payload: 'Learn Redux'

};

上面代码中,Action 的名称是ADD_TODO,它携带的信息是字符串Learn Redux。

可以这样理解,Action 描述当前发生的事情。改变 State 的唯一办法,就是使用 Action。它会运送数据到 Store。

4、Action Creator

View 要发送多少种消息,就会有多少种 Action。如果都手写,会很麻烦。可以定义一个函数来生成 Action,这个函数就叫 Action Creator。const ADD_TODO = '添加 TODO';

function addTodo(text) {

return {

type: ADD_TODO,

text

}

}

const action = addTodo('Learn Redux');

上面代码中,addTodo函数就是一个 Action Creator。

5、store.dispatch()

store.dispatch()是 View 发出 Action 的唯一方法。import { createStore } from 'redux';

const store = createStore(fn);

store.dispatch({

type: 'ADD_TODO',

payload: 'Learn Redux'

});

上面代码中,store.dispatch接受一个 Action 对象作为参数,将它发送出去。

结合 Action Creator,这段代码可以改写如下。store.dispatch(addTodo('Learn Redux'));​

6、Reducer

Store 收到 Action 以后,必须给出一个新的 State,这样 View 才会发生变化。这种 State 的计算过程就叫做 Reducer。

Reducer 是一个函数,它接受 Action 和当前 State 作为参数,返回一个新的 State。const reducer = function (state, action) {

// ...

return new_state;

};

整个应用的初始状态,可以作为 State 的默认值。下面是一个实际的例子。const defaultState = 0;

const reducer = (state = defaultState, action) => {

switch (action.type) {

case 'ADD':

return state + action.payload;

default:

return state;

}

};

const state = reducer(1, {

type: 'ADD',

payload: 2

});

上面代码中,reducer函数收到名为ADD的 Action 以后,就返回一个新的 State,作为加法的计算结果。其他运算的逻辑(比如减法),也可以根据 Action 的不同来实现。

实际应用中,Reducer 函数不用像上面这样手动调用,store.dispatch方法会触发 Reducer 的自动执行。为此,Store 需要知道 Reducer 函数,做法就是在生成 Store 的时候,将 Reducer 传入createStore方法。import { createStore } from 'redux';

const store = createStore(reducer);

上面代码中,createStore接受 Reducer 作为参数,生成一个新的 Store。以后每当store.dispatch发送过来一个新的 Action,就会自动调用 Reducer,得到新的 State。

7、store.subscribe()

Store 允许使用store.subscribe方法设置监听函数,一旦 State 发生变化,就自动执行这个函数。import { createStore } from 'redux';

const store = createStore(reducer);

store.subscribe(listener);

显然,只要把 View 的更新函数(对于 React 项目,就是组件的render方法或setState方法)放入listen,就会实现 View 的自动渲染。

store.subscribe方法返回一个函数,调用这个函数就可以解除监听。let unsubscribe = store.subscribe(() =>

console.log(store.getState())

);

unsubscribe();​

三)举个例子

简单计数器的例子:麻雀虽小,五脏俱全

主要是观察store中的三个方法:

1、store.getState(); 在视图层通过该方法取到存储在store中的state。下图中23、24行代码

2、store.dispatch(); 在视图层通过该方法发送一个actions,去通知reducers去改变state值。下面的reducer函数

3、store.subscribe(); 通过该函数设置监听,一旦state发生改变,就会调用该函数,重新渲染视图层,如下面的31行代码

很明显 redux中 reducer和Action Creators都是一个纯函数,这就要求他们不允许:直接修改 state 参数对象

请求 API

调用不纯的函数,比如 Data.now() Math.random()

那这样的话,异步操作是如何实现的呢,这就需要借助中间件redux-thunk或者redux-sage在发出action到reducer接收到action之间来执行异步操作。(redux-thunk、redux-sage介绍参考简书)const Counter = ({ value, onIncrement, onDecrement }) => (

{value}

+

-

);

const reducer = (state = 0, action) => {

switch (action.type) {

case 'INCREMENT': return state + 1;

case 'DECREMENT': return state - 1;

default: return state;

}

};

const store = createStore(reducer);

const render = () => {

ReactDOM.render(

value={store.getState()}

onIncrement={() => store.dispatch({type: 'INCREMENT'})}

onDecrement={() => store.dispatch({type: 'DECREMENT'})}

/>,

document.getElementById('root')

);

};

render();

store.subscribe(render);

react全局状态管理_react状态管理redux相关推荐

  1. react 状态驱动_React状态:做最少的事情

    react 状态驱动 为什么国家要解决如此棘手的问题? (Why is state such a hard problem to tackle?) State is a very hard conce ...

  2. react全局状态管理_react 状态管理的复杂度来源

    Ui = f(data) 本来按照这个公式,前端开发应该是非常愉悦的.最近发现有一些复杂度是因为现有的工具造成的,导致上面这个公式并不成立. 如果 data 不是一个浏览器的数据,而是数据库里的数据. ...

  3. flutter 局部状态和全局状态区别_Flutter状态管理

    Flutter状态管理 状态管理是声明式编程非常重要的一个概念,我们在前面介绍过Flutter是声明式编程的,也区分声明式编程和命令式编程的区别. 这里,我们就来系统的学习一下Flutter声明式编程 ...

  4. 如何简化React应用程序中的状态-轻松实现Redux

    by Arnel Enero 通过Arnel Enero 如何简化React应用程序中的状态-轻松实现Redux (How to simplify state in your React app - ...

  5. apollo配置中心的组件_如何使用Apollo的全新查询组件来管理本地状态

    apollo配置中心的组件 Note: This article deals with utilizing Apollo's brand new Query and Mutation componen ...

  6. Vue + Element UI 实现权限管理系统 前端篇(八):管理应用状态

    使用 Vuex 管理应用状态 1. 引入背景 像先前我们是有导航菜单栏收缩和展开功能的,但是因为组件封装的原因,隐藏按钮在头部组件,而导航菜单在导航菜单组件,这样就涉及到了组件收缩状态的共享问题.收缩 ...

  7. k8s的Pod状态和生命周期管理

    Pod状态和生命周期管理 一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod pha ...

  8. 管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程

    前言 在平常的后端项目开发中,状态机模式的使用其实没有大家想象中那么常见,笔者之前由于不在电商领域工作,很少在业务代码中用状态机来管理各种状态,一般都是手动get/set状态值.去年笔者进入了电商领域 ...

  9. Java使用cookie和session管理用户状态

    一个做移动端的,要做服务端的一些工作,没办法,工作还的继续,这就是生活,废话不说,总结一下这一天的东西,逆水行舟,努力,努力. Java什么是状态管理 一般我们会将浏览器与服务器之间多次的交互当作一个 ...

最新文章

  1. Selenium Python 解决 UnexpectedAlertPresentException
  2. 记一次从代码审计到拿下内网edr的过程
  3. 【JOURNAL】好久了啊
  4. 文件管理系统_Python学习第170节--Linux文件管理系统实际操作和具体介绍
  5. LeetCode —— 980. 不同路径 III(Python)
  6. url参数 转java对象_如何让Spring MVC接收的参数可以转换为java对象
  7. c语言翻译时为0运行为2,高级语言程序设计:、二章习题解答
  8. C++ explicit禁止单参构造函数隐式调用
  9. Yarn和SparkAlone对比
  10. 找出单身狗java_Java单身狗 —— 单例模式
  11. phpmyadmin误删表后如何恢复
  12. 学会这几个简单的bat代码,轻松在朋友面前装一波13
  13. 国科大模式识别与机器学习课程整理
  14. python-----异常处理
  15. C语言关于链表的代码看不懂?一篇文章让你拿捏二级指针并深入理解函数参数列表中传参的多种形式
  16. 最佳 Maya 免费建模插件!
  17. Dynamics CRM和企业微信集成(二)方案实现
  18. 西瓜卡顿 ANR 优化治理及监控体系建设
  19. Adobe Flash Player安装遇上错误:未能初始化的解决方法
  20. 浙大计算机考研分数线2016,2016年浙江大学考研复试分数线已经公布

热门文章

  1. Java语言用于定义接口的关键字是_定义类的保留字是(__)定义接口的保留字是(__);...
  2. java jdbc 连接mysql数据库,Java 通过JDBC连接Mysql数据库
  3. python输入三个商品_用python3采集shopify站点商品
  4. 0x30 java_终于找到了!有了它你就可以读懂字节码了!
  5. 前台传String日期格式后台用Date类型接收
  6. 如何实现input输入框自带清除按钮
  7. (需求实战_进阶_04)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试
  8. Java中的序列化与反序列化机制
  9. python获取路径下所有文件_Python获取路径下所有文件名
  10. 会不会导致内存泄漏_Java内存泄漏!为什么会泄漏?如何泄漏?怎么定位?