美文网首页redux学习
重新设计 Redux【译】

重新设计 Redux【译】

作者: 老李子果 | 来源:发表于2018-03-29 10:28 被阅读78次

重新设计 Redux【译】

原文地址
状态管理不是一个已经解决的问题了吗?我觉得开发者们似乎知道了一个隐藏的真相:状态管理没必要像现在这么难。在这篇文章中,我们将要探索几个你很可能已经问过自己的问题:

  • 你真的需要一个状态管理库吗?
  • Redux是否值得得这样大受追捧?
  • 我们能做出一个更好的状态管理方案吗?如果能,要怎样做?

状态管理真的需要一个库吗?

作为一个前端开发者并不只是移动像素,真正的开发艺术是知道把你的状态存到哪里。简单来说:这比较复杂,但又没那么复杂。
让我们看看在使用类似React这样的view框架时都有哪些选择:


1_kVjLQBND9Ji1QqgzgokHCA.png
1.组件状态(Component State)

存在于单个组件中的状态。比如在React中,用setState更新state

2.相关的状态(Relative State)

父级传到子级的状态。比如在React中在用props作为属性传到子组件。

3. Provided State

保存在一个根** provider中的状态。并且不管在组件树上接近度如何,都可以访问。比如在React中提供的context这个API。
view中包含很多状态,反映了UI界面。但其他所有反映了基础数据和逻辑的代码怎么办?
把所有的东西都放到view中会违背软件开发中
分类关注点**的原则:这使你纠缠于view框架,让你的代码难于测试,最烦人的可能是你还要不断地思考和整理到底把state保存在哪里。

状态管理由于设计改变这一事实而变得复杂,并且通常很难判断哪些组件需要哪种状态。最简单的选择是只提供根组件的所有状态,基于这点,再做选择可能会更好。

4. 外部状态(External State)

状态可以从你的view库中移出来。然后状态管理库使用生产者/消费者模式把他们“连接”起来保持同步。
Redux可能是最流行的状态管理库。过去两年它发展得极受欢迎。那为什么这样一个小库会备受青睐呢?
Redux性能更高吗?不,事实上,每个新的action都要处理会让它变得慢一些。
Redux更简单吗?当然不是。
简单应该是纯JavaScript:


屏幕快照 2018-03-28 下午4.45.34.png

那为什么不是每个人都用global.state = {}?

为什么是Redux?

本质上,Redux真的和TJ的根对象一样 ,只是包装在一个带着工具的管道中。


屏幕快照 2018-03-28 下午5.01.17.png

在Redux中,你不可以直接修改状态。唯一的方式是:分发一个Action到管道之中,让它最终来更新state。
在管道中有两种监听者:middleware和订阅(subscription)。Middleware是可以监听传入action的方法,可启用一些工具比如“logger”、“devtools”或者“syncWithServer”监听器。订阅是用来广播这些状态改变的方法。
最后,reducers是一些方法,它们可以将状态改变拆分成更小、更模块化、更可管理的分块。
开发过程中,比起用一个全局变量保存状态,用Redux确实是要简单一些。
把Redux看作是带着更新钩子函数的全局对象,而且是个转化下个状态的简单方式。

但Redux不会过于复杂吗?

是的。有几个不可否认的迹象表明一个API是有改进必要的。这些可以用下面的等式来总结:

屏幕快照 2018-03-28 下午6.04.47.png
time_saved认为是开发时你自己的解决方案可能会花费的时间,time_invested等同于阅读文档、学习教程、研究不熟悉的概念所投入的时间。
Redux本质上是一个学习曲线陡峭的小库。
这对于每个已经从Redux中克服困难并受益的开发人员来说,他们深入研究了函数式编程,与此同时可能已经失去可另一个潜在的开发人员,并且他认为“这不适合我,我要回到jQuery”。
用jQuery时你不需去明白“comonad”是什么,你也不用理解去处理状态管理的函数组合。
一个库的目的在于用抽象让复杂的问题看上去很简单。
要明确我的意图并不是怪罪Dan Abramov。
  • 你怎么去重构一个已经有数百万开发者在使用的库?
  • 您如何去辩解发布重大变更对世上不计其数的项目带来的影响?

你不能。但是你可以为广泛的文档、教育视频、技术社区提供很好的支持。Dan Abramov就赢在了这一点。
或许还有别的办法。

重新设计Redux

我认为Redux值得重写。带着七个值得改进的方面。

1.安装

让我们看看来自于官方示例官方示例的Redux基本安装。图片左侧

屏幕快照 2018-03-28 下午7.14.39.png
这仅仅是第一步,很多开发者就被迫暂停了,迷茫的看着眼前的深渊。thunkcompose这都是是什么鬼?一个函数还能这么搞事情?
考虑到如果Redux如果是基于配置而不是组合。安装更应该看起来像图右边。

2.简化的Reducer

Redux中的reducer中冗长但不必要的switch语句,虽然我们已经习惯这么用,但redux应该让我们远离它们。


屏幕快照 2018-03-28 下午7.30.33.png

假设reducer是用action的type来匹配的,我们可以反转参数,使得每个reducer都是一个纯函数接受状态和一个action。也许更简单一些,我们可以将action标准化并仅传递状态和payload。

3.Async/Await 替代 Thunks

** Thunks**通常被用来创建Redux中的异步action。在多种方法中,相比官方推荐的方案,thunk的工作方式更像是一种hack:
1.你需要dispatch一个action,这个Action实际上是一个function而不是所期望的对象。

  1. Thunk中间件检查每个action,看它们是不是个function
    3.如果是的话,中间件执行这个function并且传入两个store的方法:dispatch和getState。

真的吗?action是一个简单的动态类型这个实践还不懒,比如说objec,function,甚至是Promise


屏幕快照 2018-03-28 下午7.50.47.png

就像这个例子里,我们能只用 async/await吗?

5.两种Action

当你思考它时,就已经有两种Action了:

  • Reducer action:触发一个reducer并且改变状态。
  • Effect action:触发一个异步Action。这可以调用一个Reducer action,但是异步方法不直接改变任何状态。

让这两种action区别开来可以更有帮助并且减少之前使用“thunks”所带来的困惑。

6.不要再多作为变量的Action类型

为什么把action creator和reducer区别对待是一种标准的实践?它们其中一个可以不要对方独立存在吗?改变其中一个不会影响另外一个吗?

action creator和reducer是一个硬币的正反面。

const ACTION_ONE = 'ACTION_ONE'是把action creator和reducer分离而产生的多余副作用。把两个看做一体,就没有必要导出大量的类型字符串文件了。

7.Reducers 就是Action Creators

根据用途对Redux的元素进行分组,您可能会想出一个更简单的模式。


屏幕快照 2018-03-28 下午11.39.03.png

可以通过reducer自动确定 action creator。总之,在这种情况下,reducer可以成为action creator。
使用基本的命名约定,以下内容是可预测的:

  • 如果一个reducer有一个叫 “increment”的名字,那么类型就是 “increment”。更好的是,让我们来命名它:“count/increment”。
  • 每个Action通过一个叫“payload”的键值来传递数据。
屏幕快照 2018-03-28 下午11.48.28.png

现在通过 count.increment,我们就可以从reducer中生成一个Action creator了。

好消息:我们能拥有一个更好的Redux

以上的痛点就是我们创造Rematch的原因。

屏幕快照 2018-03-29 上午9.38.21.png
Rematch是对Redux的一个包装,它在不损失任何可配置性的情况下提供了更简单的API。
屏幕快照 2018-03-29 上午9.39.58.png
以下是使用Rematch的一个完整例子:
屏幕快照 2018-03-29 上午9.41.47.png
过去几个月我一直在生产环境中使用Rematch。我可以证明:
我从未在思考状态管理时花费这么少的时间。
Redux并没有离开,也不会离开。它拥有Redux背后的简单模式,学习曲线少,样板少,认知开销少。
试试Rematch吧,看看你到底喜不喜欢。
在帮我们点个star,好让我们知道你已经试过了。

相关文章

  • 重新设计 Redux【译】

    重新设计 Redux【译】 原文地址状态管理不是一个已经解决的问题了吗?我觉得开发者们似乎知道了一个隐藏的真相:状...

  • Redux从设计到源码

    Redux背后的设计思想 在讲设计思想前,先简单讲下Redux是什么?我们为什么要用Redux? Redux是什么...

  • 精读《重新思考 Redux》

    本周精读内容是 《重新思考 Redux》。 1 引言 《重新思考 Redux》是 rematch 作者 Shawn...

  • redux 总结

    redux redux概念 Redux是JavaScript应用程序的可预测状态容器。 redux 设计思想 We...

  • 阅迹(二)

    3.23 看过 javascript函数式编程入门小结 [译]深入浅出Redux中间件 Redux 中文文档 [章...

  • 有标题的文章

    React Redux 路由设计 - - React

  • react理解 ----redux

    一. Redux简介 --- fluxRedux是什么以及Redux设计和使用的三大原则Redux核心API与R...

  • Redux使用心得

    一、前言 二、 Redux的设计思想 三、 Redux的三原则 三、 Redux的基本概念 3.1 store 例...

  • Ameblo2016 ~ React/Redux打造的同构Web

    译自 CyberAgent Developers Blog原文标题 「アメブロ2016 ~ React/Redux...

  • Redux初步理解

    Redux笔记 参考理解 Redux 中文文档Redux 阮一峰 严格的单向数据流是Rduex设计核心。 Redu...

网友评论

本文标题:重新设计 Redux【译】

本文链接:https://www.haomeiwen.com/subject/lhfmcftx.html