Redux 知识点梳理和实践

简介: 之前在有道云笔记上写过一篇 Redux 学习实践的文章,附带了一个小 Demo。由于一段时间没看 Redux,加上之前缺乏足够的练习,现在想重构个人博客,使用 Redux 进行状态。现在不得不回头再看看 Redux 相关东西。

之前在有道云笔记上写过一篇 Redux 学习实践的文章,附带了一个小 Demo。由于一段时间没看 Redux,加上之前缺乏足够的练习,现在想重构个人博客,使用 Redux 进行状态。现在不得不回头再看看 Redux 相关东西。这里顺便记录下学习笔记,一来便于回顾,二来希望对他人有所帮助。笔记同步写在个人博客网站

这篇文章是知识点的梳理,如果你对 Redux 的基础有一定了解,阅读起来可能比较合适。

什么是 Redux?

Redux 可以说是 Flux 架构思想的最佳实践方案,用于对大型、复杂、多数据来源的 React 进行数据管理。遵循 Redux 的设计原则,再配合 React 容器组件、展示组件分离的代码组织原则,可以让我们的项目结构清晰,数据流清晰,十分利于项目的维护开发。

Redux 设计的三大原则

  1. 单一的数据来源,所有的数据保存在一个对象中。
  2. 状态只读,Reducer 根据 store dispatch 的 action 类型返回一个新的状态,不修改原来的状态。
  3. 状态修改均由纯函数完成。

关于这三大原则的深入理解建议参考 《深入React技术栈》、《深入浅出React和Redux》

浅谈 Redux 的工作过程(和 MVC 的主要区别)

有 MVC 框架使用经验的同学应该清楚,MVC 的工作过程是这样:view 层将用户行为传递到 controller 中的action, controller 中的 action 和 Model 层交互操作数据,返回到 view。通常 MVC 框架的实现 M 和 V 层是可以交互的,这样数据就不是单向流动,这种设计很多场景下很灵活,写起来很爽快,但是要项目过大,项目数据流复杂,项目维护就不爽了。

Redux 则严格遵循上面提到的设计三大原则,工作过程是这样的:view 层触发一个 action,这个 action 由 store.dispatch(action) 传递给 reducer,reducer 根据 previousState 和 action type 返回一个新的 state(不修改数据), 如此实现了数据的变更。

Redux 核心 API

上面 Redux 的工作过程提到了 Redux 有 store、action、reducer 这些概念,这些都是 Redux 对外提供的核心 API,我们来看看他们分别是干嘛的。

  1. store

    store 作为整个应用数据的唯一来源,用于保存数据和 dispatch action。store 使用 Redux 提供的 createStore 方法来生成。


import { createStore } from 'redux';
let store = createStore(reducer)

createStore 接受一个 reducer 作为参数,返回一个 store 对象。store 对象包含 4 中方法:


getState():// 用于获取 store 中当前的状态
dispatch():// 用于分发 action,这个是改变 store 中数据的唯一方式
subscribe(listener):// 注册一个监听者,在 store 发生变化时被调用
replaceReducer(nextReducer):///更新当前 store 中的 reducer

reducer

reducer 本质上是一个函数,这个函数能接受一个 action 和一个旧的状态(previousState),根据 previousState 和 action 返回新的状态


reducer(previousState, action) => newState

reducer 必须是一个纯函数,不能修改原来状态,关于纯函数的概念请阅读其他资料学习。

  1. action

    reducer 的 action 本质上是一个 javaScript 对象,这个对象必须有一个 type 属性,用来表明 action 的类型,还可以有 payload, error, meta 属性。关于 action 对象的属性,社区有个规范,可以参考github.com/redux-utili…



const action = {
    type: 'ADD_TODO',
    payload: 'todo'
}

  1. reducer 就是根据 action type 属性来决定返回新的 state。

先睹为快

我在学习 Redux 的时候,看了很多文档,认为对 Redux 的概念了然于胸,但是动手写第一个小 Demo 的时候仍然觉得很难下手,可能是 Redux 这些概念对我而言太新。这里给出我写的第一个小 Demo。

这个 Demo 实现了点击按钮让数字加一减一的功能,没有任何复杂度,单纯的是为了了解 actionstorereducer 的具体作用和协作关系。

Demo 地址: github.com/wewin11235/…

为了便于观察,Demo 的代码都丢在了一个文件里,在实际开发中,一定要遵循好的代码组织原则。



import React from 'react';
import ReactDOM from 'react-dom';

// 创建 action
// action 是 javaScript 对象,是用户行为的抽象,必须包含一个 stype 字段
// 根据 Demo 需要实现记数功能,抽象出两种 action, 一种表示加,一种表示减
const incream_action = { type: 'INCREAM' };
const decream_action = { type: 'DECREME' };

// 创建 reducer
// reducer 接受一个 previousState 和 action 返回一个新的 state
const reducer = (state=0, action) => {
  switch (action.type) {
    case incream_action.type:
      return state + 1;
    case decream_action.type:
      return state - 1;
    default:
      console.log('default');
      return state;
  }
}

// 创建 store
// store 创建使用 createStore(reducers)
// createStore 由 redux 提供
import { createStore } from 'redux';
let store = createStore(reducer);

// 创建计数组件
class Counter extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {
    const { count, doIncrement, doDecrement } = this.props
    return(
      <div>
        <span>{count}</span>
        <button onClick={doIncrement}>+</button>
        <button onClick={doDecrement}>-</button>
      </div>
    )
  }
}

const render = () => ReactDOM.render(
  <Counter
    count={store.getState()}
    doIncrement={() => store.dispatch(incream_action)}
    doDecrement={() => store.dispatch(decream_action)}
  />,
  document.getElementById('root')
);

render();

// 为了能在 store 发生变化后能刷新页面,需要给 store 注册一个监听事件
// store 变化后,刷新页面
store.subscribe(render);

最小 Redux 应用诞生。

欢迎指正,补充!


原文发布时间为:2018年06月27日
原文作者: 蚂蚁哈哈哈
本文来源:  掘金  如需转载请联系原作者
相关文章
|
缓存 Java
认真阅读完这篇文章熟练掌握阿里巴巴规范创建Java线程池
认真阅读完这篇文章熟练掌握阿里巴巴规范创建Java线程池
984 0
|
安全 算法 区块链
花无涯带你走进黑客世界之Tor洋葱网络
Tor本来是为用户提供匿名上网保护用户隐私的工具,但是对于一些用户来说,他们可以利用Tor的隐蔽性进行黑客攻击或非法交易活动。总结Tor的恶意应用主要表现在以下几方面。
753 0
|
小程序 开发者 安全
福利!支付宝小程序开发必备的7款开源DEMO
相比于APP,小程序已经大大降低了开发者们的学习和开发的门槛。而如何进一步提高小程序开发者的学习和开发效率,一直是支付宝小程序团队非常重视的课题。对于开发者而言, 文档可以提供基础的引导,而针对性的、基于常见场景的DEMO则更为直观清晰易懂,可以大大节约上手的成本。
7826 0
福利!支付宝小程序开发必备的7款开源DEMO
|
前端开发 JavaScript API
探索现代前端框架——React 的性能优化策略
探索现代前端框架——React 的性能优化策略
389 0
|
10月前
|
机器学习/深度学习 人工智能 边缘计算
联邦
随着人工智能的发展,联邦学习在打破“数据孤岛”和保护隐私方面展现出巨大潜力,但也面临诸多安全挑战。本文总结了五个关键研究方向:1. 提高防御方法的鲁棒性,以应对多种攻击;2. 研究更多样化的攻击手段,促进防御进步;3. 提升通信效率,平衡安全与性能;4. 探索异构联邦学习,拓展应用场景;5. 增强模型可解释性,确保应用安全。未来需深入研究这些方向,推动联邦学习成为数据安全领域的关键技术。
|
算法 程序员
程序员必知:XGB算法梳理
程序员必知:XGB算法梳理
296 0
|
存储 安全 数据安全/隐私保护
深入探索Android与iOS的隐私保护机制:一场没有硝烟的较量####
本文深度剖析了Android与iOS两大移动操作系统在用户隐私保护方面的策略与实践,揭示两者在设计理念、技术实现及用户体验上的异同。通过对比分析,旨在为读者提供一个全面而深入的视角,理解两大平台如何在保障用户隐私的同时,实现功能的丰富与便捷。本文不涉及具体产品推荐或品牌偏好,仅从技术角度出发,探讨隐私保护的现状与挑战。 ####
|
12月前
|
数据挖掘
企业成长伙伴:销售易、创客、用友CRM系统的特色与适用性
销售易、创客和用友是企业资源规划和客户关系管理领域的三大品牌。销售易专注于CRM解决方案,提供从线索到现金的全流程管理,适用于追求高效率的大型企业;创客为中小企业提供低成本、易用的CRM系统,助力业务增长;用友则以其强大的集成能力和行业解决方案,服务于中大型企业,特别是在制造业和金融服务业。选择CRM系统时,企业应根据自身需求、预算和发展规划,挑选最适合的解决方案。
|
传感器 监控 物联网
无线传感器网络的基本架构及其广泛应用
无线传感器网络的基本架构及其广泛应用
1118 1
|
移动开发 IDE Android开发
安卓与iOS开发环境的深度剖析
本文将深入探讨安卓(Android)和iOS两大主流移动操作系统的开发环境,从技术架构、开发语言、工具链、生态系统等多个维度进行对比分析。我们将揭示两者在应用开发过程中的异同点,为开发者提供选择平台时的技术参考,同时展望移动开发领域的未来趋势。通过综合比较,本文旨在呈现一个全面、立体的开发环境画像,助力开发者更好地理解并适应不断变化的移动技术生态。
300 0