React Redux应用程序架构

前言



这是我关于哈布雷的第一篇文章,所以不要太苛刻(好吧,或者要有建设性地判断)。



我想指出的是,采用这种方法,对我而言,主要优势在于,我们清楚地按模块划分和委托了业务逻辑。一个模块负责一件事情和非常具体的事情。也就是说,使用这种方法,在开发过程中没有想到:“我在哪里可以(更好地)做到这一点?” 通过这种方法,可以立即清楚地确定应该在哪里解决任务/问题。



档案结构



项目结构+是标准的。我将尝试简要地告诉您程序集本身所包含的内容







  • 为了准备异步操作,我使用了传奇的中间件-关于thunk中间件的更加灵活和强大的功能

  • 我有css-modules样式组件。实际上,该概念与样式化组件的概念相同,但是以某种方式对我来说更方便
  • 容器和组件之间的中间层,用于控制从商店扔到组件中的道具(过滤,备忘录和方便地操纵任何应用程序状态的字段名称的能力)-重新选择


Redux Sagas



Redux sagas文档sagas



的主要本质(并且不仅是)是我们将按模块处理请求的业务逻辑分开。每个传奇都负责自己的API。如果我需要获取用户数据并对其成功收货采取行动-我将在单独的模块usersSagas.js中



进行操作。支持sagas的主要因素(对我而言)是:

UPD(增加了关于承诺地狱的要点)

  • 1)以友善的方式行事的事实应该仅仅是赋予对象的功能。如果某些动作看起来有所不同(这就是使用重击功能时发生的事情),我想以某种方式将它们转换为一种形式,因为某种程度上这并不适合单个概念。我想将请求的逻辑和处理请求的数据放到一个单独的模块中-这就是sagas的用途

  • 2)通常,如果我们需要发出几个使用来自对先前请求的响应中的数据的请求(并且我们不想在存储中存储中间数据?),则Redux-thunk邀请我们做出新的操作,在该操作中我们将调用另一个异步操作请求,其中进行了2次(例如)相同的迭代。就我而言,它散布着许诺的地狱,通常看起来很凌乱,而且使用起来不方便(嵌套太多)









CSS模块/样式化的组件



我经常在项目中看到人们在一些常见的CSS模块中编写样式组件的规则。



我完全反对。该组件是一个隔离的系统。它应该尽可能地可重用。因此,最好单独设置样式。











重新选择



选择器有几个目标:



  • , . , , ( , ). , , . - getFilteredItems,
  • ,
  • . - . - . friends. , . , . , , friends contacts. reselect , , . — .


因为最后一点,我淹没了,因为我们每打喷嚏都会重做一次。重新选择-不仅用于记忆,还用于更方便地绘制应用程序状态树







组件和容器



在经典的React方法中(不使用用于将商店存储为单独实体的库),有两种类型的组件-Presentational和Container-Components。通常(据我了解),这不是严格的文件夹划分,而是概念上的划分。



表达的成分是愚蠢的。实际上,它们只是作为道具投入到其中的数据的布局和显示。 (此类组件的示例可以在上面的css-modules中找到)



容器组件-封装了处理组件生命周期的逻辑的组件。例如,他们负责调用负责请求数据的操作。它们返回最小的布局,因为布局是在Presentational-Components中隔离的。



例子+-容器组件:







Redux容器实际上是redax端和react组件之间的一层。在它们中,我们调用选择器并将动作扔进组件的react道具中。



我是FOR有每一个喷嚏其自己的容器。首先,它使您能够更好地控制投掷到组件中的道具,其次,它使您可以使用重新选择来控制性能。



通常,我们需要重用一个组件,但是要使用商店的不同部分。事实证明,为此,我们只需要编写另一个容器并在需要时将其返回即可。就是说,多对一的关系(很多是容器,一个是组件。对我来说,从概念上来说很方便)



我还想举一个更常见的示例,以支持对大多数组件进行容器化。



我们有一组数据(例如,一组用户),这些数据是从某些API接收的。我们还有无限滚动,客户不会拒绝。我们向下滚动了很长时间,并加载了约10k +数据。现在,我们更改了一个用户的某些属性。我们的应用程序将减慢很多速度,因为:



  1. 我们将全局容器附加到带有用户列表的整个页面上
  2. 更改用户数组的一个元素的一个字段时,将在用户缩减程序中返回一个具有新元素和索引的NEW数组
  3. 放置在UsersPage组件树中的所有组件都将被重绘。包括每个用户组件(数组元素)


如何避免这种情况?



我们制作容器



  • 与用户排列
  • 数组元素(一个用户)


此后,在包装在“带有用户的数组”容器中的组件中,我们返回“数组元素(一个用户)”容器,并



在其中放置了键(需要响应的道具),索引在mapStateToProps的“数组元素(一个用户)”容器中,我们是第二个容器作为参数,我们采用容器返回的组件的ownProps(在索引中)。通过索引,我们仅从存储中直接取出数组的一个元素。



此外,优化仅更改元素的重绘会变得更加容易(整个数组被重绘,因为在化简器中我们做了某种映射-为每个元素返回一个带有新索引NEW数组)-在这里我们将通过重新选择



container array:







container element来帮助您







element-selector:







如果有任何补充,我将在评论中愉快地阅读它们。



All Articles