Redux 能做什么?

一、我先给一个 Redux 的定义

Redux 被大家知道应该都是来自于 React 的出现,但是这篇文章会通过介绍一个 React 之外的例子,来让大家理解 Redux 是什么东西,到底还能够做点撒。

我自己的理解是:

Redux 是一个改变状态(state)的模型,这个模型通过一个单向操作的方式来改变状态,用数学符号的方式来理解我认为应该是:y = f(x),嗯,就是一个最简单的函数模型。

不过这样说,有些人还会不理解,毕竟以前撸代码不是这个样子的,那么我们先反向的来获取自己的理解。

首先,我们需要知道 Redux 有的以下几个东西:

createStore
reducer
dispatch

我觉得需要介绍清楚 Redux ,知道这三个就行了,至于还有一些函数我觉得都是调味料,这里先不介绍。

好吧,现在我就把上面的数学函数模型语义的转换一下(也许不一定对,但是可能暂时这样理解,理解是一个过程):

第一步:newState = store(reducer)(state)
第二步:newState = reducer(state)
为什么这里可能理解成两个步骤呢?那是因为我们可以从不同的层面去认识 Redux,在第一步中我的理解是store里面的东西(reducer)去改变了 state,而在第二步中,我以实际会起到作用的层面去理解,就是 reducer 去改变了 state。

好吧,来个对比:

y = f(x)
newState = reducer(state)

最后我自己先得出一个结论:

f <=> reducer ( <=>: 表示等价的意思)

好吧,废话就上面那么多了,接下来我举一个实际的例子来理一下自己对 Redux 的理解,这个例子是我在一篇文章中看到的,觉得不错。

二、 先介绍一下这个例子的效果

这里我们要实现的效果就是:

点击飞机,让飞机随机移动到一个新的坐标点

这里我们可以理解为:新坐标[x1, y1] = f(原始坐标[x0, y0])

三、开始撸一个实例

1.首先我们需要定义个 f 来修改坐标

/**
 * reducer
 * @param state 坐标状态
 * @param action 执行的行为
*/
function coordinates(state = [1, 1], action) {
    switch (action.type) {
        case CLICK:
            return [
                state[0] + 40 * Math.random(),
                state[1] + 40 * Math.random()
            ]
        default:
            return state;
    }
}

这个函数主要就是使初始坐标 [1, 1] => [1 + random, 1 + random] 这样返回一个全新的数组,这个全新的数组就是新的状态。

2.我们再将这个 f 函数给 Redux 的 Store 去管理

/**
 * 创建 Redux 的 Store(存储器)
*/
let store = createStore(coordinates);

这个比较简单,就是通过传入 f 来创建一个 Store,对于 Redux 来说有且只有一个 Store,这个和 flux 有比较大的差别。

3.然后再定义一个行为,使我们能够通过 dispatch 调用这个行为去改变 state

/**
 * action
*/
const CLICK = 'CLICK';
/**
 * @returns plainObject => action
 */
function click() {
    return {
        type: CLICK
    }
}

在 Redux 中,只有通过 dispatch 方法去改变状态,就是因为这样,才让我们调试代码变得简单,复现 BUG 更加容易,因为它是单向的,顺着一个方向在流动数据。

4.接下来就写一下 dispatch

plane.events.onInputDown.add(() => {
    store.dispatch(click())
}, null);

先抛开其他代码,我们剥离一下:

store.dispatch(click())

这样就会去调用行为,然后执行我们上面定义的 coordinates 函数,返回一个新的坐标

5.最后我们再订阅一下具体改变我们飞机位置的业务代码

上面的写完后,我们只是返回来状态,但是还没体现到飞机在场景下的移动效果。我们能够通过

store.getState()

来获取最新的当前状态,其实在 Redux 源代码里面就是很简单的一个函数:

function getState() {
    // 这里的 currentState 是一个外部的变量,在 Store 的作用域下全局生效
    return currentState;
}

好吧,现在我们让飞机订阅一下移动的函数:

/**
* 定义 plane(飞机) 的移动
*/
function movePlane(plane) {
    game.add.tween(plane).to({
        x: store.getState()[0],
        y: store.getState()[1]
    }, 1000, 'Linear', true);
}
/**
* 移动事件的订阅
*/
store.subscribe(movePlane.bind(null, plane));

大家会想,为什么我订阅了就自动调用 movePlane 生效了呢?在 Redux 内部会调用当前的监听器,源代码如下,很简单,监听器就是一个数组来装的,最后移出来执行一下:

function subscribe(listener) {
    var isSubscribed = true;

    ensureCanMutateNextListeners();
    nextListeners.push(listener);

    // 然后会返回一个取消订阅的函数,这里省略
}
function dispatch(action) {
    // 省略一些杂七杂八的异常处理代码

    try {
        isDispatching = true;
        currentState = currentReducer(currentState, action);
    } finally {
        isDispatching = false;
    }

    // 执行的代码
    var listeners = currentListeners = nextListeners;
    for (var i = 0; i < listeners.length; i++) {
        listeners[i]();
    }

    return action;
}

好吧,这样就是一个游戏的流程来,在 Redux 的帮助下,很好的组织了代码,优雅的完成了。执行代码的流程是这样的:

dispatch(click()) => update reducer => subscribe() => 飞机移动新位置

文章转载自 开源中国社区 [http://www.oschina.net]

时间: 2024-10-31 05:09:16

Redux 能做什么?的相关文章

基于Reactjs实现webapp(加精)

git原文链接:https://github.com/my-fe/wiki/issues/1 由于最近的reactjs实在太火,而且距离第一版已经快2年的时间了,已经相对稳定和成熟了,基于这两个前提下,团队对reactjs及其他开源技术进行了相关调研,发现落地是可行的,我们有4名前端同学,从调研到上线,大概花了1个半月的时间,期间有踩一些坑,后面会说,整个开发总体来说是非常顺利的,下面进入正题~~ 产品简介 线上应用:mami.baidu.com 我们做的是一个移动端的单页webapp,可以在这

Redux教程2:链接React

序 通过前面的教程,我们有了简单的环境,并且可以运行 Redux 的程序,也对 如何编写Redux示例 有了初步的印象: 掌握了 使用Redux控制状态转移,继而驱动 React 组件发生改变,这才是学习Redux的初衷. 本篇我们将 Redux 和 React 联合起来,着重讲解 redux-react 模块的使用: 1.编写红绿灯React组件 在原有的基础上,我们编写红绿灯组件: touch components/light/index.js components/light/index.

图解redux和react的关系

最近研究了下redux项目里的example里面的目录结构,发现里面文件夹比较多,概念也比较多,所以画图整理一下: 以examples中的real-world为例,文件结构长这个样子 先简单看一下redux和react的数据流: redux ┌──────────────────────────┐ │ │ │ │ │ ┌────────────────────┐ │ │ Reducers │ │ └────────────────────┘ │ ▲ ▼ │ ┌────────────────┐

Redux系列x:源码解析

写在前面 redux的源码很简洁,除了applyMiddleware比较绕难以理解外,大部分还是 这里假设读者对redux有一定了解,就不科普redux的概念和API啥的啦,这部分建议直接看官方文档. 此外,源码解析的中文批注版已上传至github,可点击查看.本文相关示例代码,可点击查看. 源码解析概览 将redux下载下来,然后看下他的目录结构. npm install redux 这里我们需要关心的主要是src目录,源码解析需要关心的文件都在这里面了 index.js:redux主文件,主

函数式编程在Redux/React中的应用

本文简述了软件复杂度问题及应对策略:抽象和组合;展示了抽象和组合在函数式编程中的应用;并展示了Redux/React在解决前端状态管理的复杂度方面对上述理论的实践.这其中包括了一段有趣的Redux推导. 软件复杂度及其应对策略 软件复杂度 软件的首要技术使命是管理复杂度.--代码大全 在软件开发过程中,随着需求的变化和系统规模的增大,我们的项目不可避免地会趋于复杂.如何对软件复杂度及其增长速率进行有效控制,便成为一个日益突出的问题.下面介绍两种控制复杂度的有效策略. 对应策略 抽象 世界的复杂.

[译] 在大型应用中使用 Redux 的五个技巧

本文讲的是[译] 在大型应用中使用 Redux 的五个技巧, 原文地址:Five Tips for Working with Redux in Large Applications 原文作者:AppNexus Engineering 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:loveky 校对者:stormrabbit 在大型应用中使用 Redux 的五个技巧 Redux 是一个很棒的用于管理应用程序"状态(state)"的工具.单向数

[译] Redux 异步四兄弟

本文讲的是[译] Redux 异步四兄弟, 原文地址:Redux 4 Ways 原文作者:本篇文章已获得作者 Nader Dabit 授权 译文出自:掘金翻译计划 译者:reid3290 校对者:rccoder,xekri 在十分钟内实践 Thunk . Saga . Observable 以及 Redux Promise Middleware. 在上一次的 React Native online meetup 活动中,笔者就 Thunk . Saga 以及 Redux Observable 之

实践 Redux,第 1 部分: Redux-ORM 基础

本文讲的是实践 Redux,第 1 部分: Redux-ORM 基础, 使用 Redux-ORM 来帮助你管理范式化 state 的有用技术,第 1 部分: Redux-ORM 使用场景以及基础的使用 系列目录 第 0 部分:系列简介 第 1 部分:Redux-ORM 基础 第 2 部分:Redux-ORM 概念和技术 简介 在过去的一年里,我成为了一个名叫 Redux-ORM 库的大粉丝,这个库是 Tommi Kaikkonen 写的.它帮助我解决了一些对很多 Redux 应用来说常见的使用场

2016年里做前端是怎样一种体验

问:最近我接手了一个新的Web项目,不过老实说我已经好久没碰过这方面的代码了.听说前端的技术栈已经发生了极大的变革,不知道你现在是不是仍然处于最前沿的开发者阵列?   答:准确来说,过去俗称的写网页的,现在应该叫做Front End Engineer,我确实属于这所谓的前端工程师.并且我才从JSConf与ReactConf面基回来,因此我觉得我觉得我还是了解目前Web前端领域最新的面貌的.     问:不错不错,我的需求其实也不复杂,就是从后端提供的REST风格的EndPoint来获取用户活动数