首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redux简介

1.使用场景

虽然好,也并不是什么情况下都要使用,如果在项目中遇到一下场景,你会自发的寻找一个工具来解决问题,这时就是隆重登场的时候了:

业务层面:

用户的使用方式复杂

不同身份的用户有不同的使用方式(比如普通用户和管理员)

多个用户之间可以协作

与服务器大量交互,或者使用了

要从多个来源获取数据

组件层面:

某个组件的状态,需要共享

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

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

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

如果通过上面的考虑,你还是不知道是否需要使用,那很有可能就是你不需要使用

2.设计思想

两句话概括:

Web 应用是一个状态机,视图与状态是一一对应的。

所有的状态,保存在一个对象里面。

结合这个图对原理做一下解释,也许有些名字还是不懂,但是可以先有个印象,接下来我们会做进一步的介绍。

用户会在上进行一系列操作,而每一个操作都对应一个。对象通过调用方法,传入上次的状态()和操作(),经过针对不同的,改变的值,然后返回一个,然后对象可以通过方法,获取这个新状态。最后进行相应的视图更新。web应用所有的状态都保存在中,每一个都对应一个视图。

3.核心概念

state:

整个都是围绕状态进行的操作,所有的 都被保存在一个单一对象中。建议在写代码前先想一下这个对象的结构。如何才能以最简的形式把应用的 用对象描述出来。如果应用较复杂在创建对象时,可以参考这些意见:http://cn.redux.js.org/docs/recipes/reducers/NormalizingStateShape.html。应用的初始状态可以在创建时传入,也可以根据中的默认值自动生成。

action:

每一个都有个对应的操作,所以中有这个操作的名字(类型)和需要的数据。 是把数据从应用传到 的有效载荷,它是数据的唯一来源。一般来说你会通过 将 传到 ;它本质上是JavaScripte的普通对象:

对象中字段一般是必须的,用来描述操作的类型。其他的参数都可以根据操作的需要,进行自定义扩充。

这个例子是像toDolist中添加一项,字段是这个todo的内容。很明显我们不能每一个不同的内容都有个,这个需要

reducer:

只是描述了一个操作,而没有描述如何针对这个进行状态更改。则描述了如何根据传入的,对状态做相应的改变。

在编写函数是要保证它的纯净性,不要进行以下操作:

不要修改传入的参数,尤其是在处理时,要返回新的对象

执行有副作用的操作,如 API 请求和路由跳转

调用非纯函数,如 或

要保证只要传入参数相同,返回计算得到的下一个就一定相同。没有特殊情况、没有副作用,没有API请求、没有变量修改,单纯执行计算

Store:

就是把、、 联系到一起的对象。 有以下职责

维持应用的

提供 方法获取

提供方法,然后通过更新

通过 注册监听器

通过返回的函数注销监听器

Redux应用只有一个单一的。当需要拆分数据处理逻辑时,你应该使用 组合而不是创建多个 。

数据流:

严格的单向数据流是 架构的设计核心:

用户行为引起调用

调用函数:两个参数,当前的state和action

返回计算过的

触发所有订阅

4.简单实例

下面是一个toDoList的简单实例

http://jsbin.com/noxalaw/edit?html,js,console,output

5.高级用法

异步action:

上面讲到的触发的动作都是同步的,如果有异步的该如何处理呢?同步时只需触发一个,当异步时要要触发三个,分别为:

发起:操作开始时,送出一个 ,触发更新为"正在操作"状态, 重新渲染

成功: 操作结束后,再送出一个 ,触发 更新为"操作结束"状态, 再一次重新渲染

失败: 请求失败时发出,触发更新,显示错误状态

这三个对应的描述如下:

给出一个异的示例:

现在返回了一个函数,而在同步时返回一个普通对像。在默认情况下的参数只能是一个对象,不能是一个函数。这个时候就需要引入中间件: ,让参数可以传入函数。

所以,异步操作的一种解决方案就是:

一个返回函数的 ,

使用中间件改造,使其能支持函数作为参数

至于中间件是如何操作的,这里就不细述了,有兴趣的同学可以参考http://cn.redux.js.org/docs/advanced/Middleware.html

6.异步action的完整实例

http://jsbin.com/xexax/edit?html,js,console,output

参考:

http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html

http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_two_async_operations.html

https://tech.meituan.com/redux-design-code.html

https://cn.redux.js.org/docs/basics/

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180518G0RLO600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券