如何优雅的设计Redux中的Store
用了几个月的redux,现在回过来总结一下。
刚开始用的时候遇到一个比较大的疑问,就是如何设计redux的store中的state树,这应该是我在使用redux中最大的一个疑问,阻挡了我前进的脚步,经过一段时间的研究,我这里给大家用非常通俗易懂的方式说一说我的疑问,以及我是如何解决的。
当初主要的疑问是:
1.state树是按照页面划分
2.还是按照数据库中的表划分
第一种就是把每个页面当成一个业务模块,实际上这也是比较流行的一种做法,有很多公司是这么做的,比如你可以像下面这样初始化你的store
module.exports = function() {
return {
common: {
isFetching: false
},
profile: {
},
list: {
},
edit: {
},
home: {
}
}
}
这种方式的优点就是模块与模块之间互相独立,不会相互影响,每个页面维护自己的reducer,并且只在store中存入该页面展示或者变化的最小数据,使用起来很方便,不太需要关心其他模块的缓存数据,比较符合redux设计的初衷(并不是用来做一个前端数据库),但这种方法有个致命的缺点,就是store中数据的同步问题和冗余问题。假如一个列表页面的数据依赖于另一个编辑页面的操作,在编辑页面,改变了数据,这时候数据库里面的数据已经被改变了,但这时候列表页面和编辑页面的state是独立的,列表页面state节点下的数据并没有改变,退回到列表展示页,数据并不会发生变化,这就有问题了,而且同一份数据出现在多个节点下,也会有数据冗余的问题。
要让依赖的列表页面也产生同步的更新,这里有四种做法:
1.每次进入列表页面去数据库刷新store(如果你做的是一个用户端App显然不会这么干,只可能在第一次进入的时候才会载入数据,第二次应该就不会发请求了,立即从store中拿出缓存数据,否则性能和体验太差,PC端后台倒是无所谓)
2.编辑完保存后dispatch一个或多个action,去改变所有依赖到这条数据的页面的state(相对还是比较可靠的办法,前提是依赖的页面很少,如果是一个庞大的系统,每次新增加一个页面,你就需要去修改派发action的代码,太麻烦了,除非建立一个完备的事件系统,所有依赖到这条数据的页面都监听一个事件,只要一编辑,就触发所有的事件,更新自己的state节点),如果是这种情况,可以考虑看一看 rxjs
3.编辑完后除了更新数据库中的数据,在前端这边什么都不做,返回列表页,先取出缓存数据展示,等到页面DidMount之后发一个请求,不要出loading图,检查一下数据是否被更新过,如果是,拉取最新数据并更新store,如果不是,那就不变
4.列表页和编辑页共用一个state数据节点,列表页只存必要显示的字段,点击进入编辑页,根据列表页的记录id读取更详细的信息,编辑保存完成后,更新到这个state节点(这种方法其实采用的就是按数据库表划分的办法,统一数据源,关于统一数据源格式,可以看一看 normalizr )
注意:没有人告诉过你,用了redux必须通篇要用store中的state,redux作者也没有这么讲过,比较好的做法是结合react组件自己的state和store中的state一起使用。
第二种就是按照数据库中的表划分,比如你可以像下面这样初始化你的store
module.exports = function() {
return {
common: {
isFetching: false
},
companies: {
},
users: {
},
events: {
}
}
}
这种方法可能比较适合单页应用,比如(trello,coding.net),把store当成数据库使,增删改查都维护这一个store,作为前端数据源,保证前端数据源和后端数据库同步,并且保证了操作的及时反馈,适合对用户体验要求较高的场景,缺点就是前端不像后端,除了model数据,还有业务数据,临时状态数据,不能简单的用数据库的思路去设计store,如果是这样,那么为什么不用前端数据库呢?为啥还要用redux来多此一举,redux本质上是用来管理数据状态的。
所以,我认为还是按照页面来划分,但应该把第二种方法的思路结合进来。
在此之前,先要认清哪些数据应该被放到store,如果是临时数据,不需要缓存的,我们应该用react自己的state去维护状态,而不是丢进store。如果该数据需要缓存,但只被一个页面依赖了,那么放进该页面节点下的state。如果该数据需要缓存,被多个页面依赖了,那么我们应该将它提出来,放到一个公共state节点下。
redux作者的意思大概就是,对于store中的state树,躺着用,站着用,跪着用,想怎么用怎么用,并没有明确规定必须怎么用,只要自己用的舒服,解决你自己的特殊场景就可以了。
如何优雅的设计Redux中的Store的更多相关文章
- 通过三张图了解Redux中的重要概念
上周利用业余的时间看了看Redux,刚开始有点不适应,一下在有了Action.Reducer.Store和Middleware这么多新的概念. 经过一些了解之后,发现Redux的单向数据里的模式还是比 ...
- Redux中的重要概念
Action/Reducer/Store 首先,先看看第一张图,图中展示了Redux的单向数据流,以及Action.Reducer和Store这三个核心概念. 下面就围绕上图,非别介绍Action.R ...
- 如何优雅的设计React组件
如何优雅的设计 React 组件 如今的 web 前端已被 React.Vue 和 Angular 三分天下,一统江山十几年的 jQuery 显然已经很难满足现在的开发模式.那么,为什么大家会觉得 j ...
- Redux 中的CombineReducer的函数详解
combineReducers(reducers) 随着应用变得复杂,需要对 reducer 函数 进行拆分,拆分后的每一块独立负责管理 state 的一部分. combineReducers 辅助函 ...
- 关于props和state以及redux中的state
React的数据模型分为共有数据和私有数据,共有数据可以在组件间进行传递,私有数据为当前组件私有.共有数据在React中使用props对象来调用,它包含标签所有的属性名称和属性值,props对象有三个 ...
- 25.redux回顾,redux中的action函数异步
回顾:Redux: 类似于 Vuex 概念:store/reducer/action action:动作 {type,.....} 一定要有type 其他属性不做限制 reducer:通过计算产生st ...
- 在react/redux中使用Immutable
在redux中使用Immutable 1.什么是Immutable? Immutable是一旦创建,就不能被更改的数据. 对Immutable对象的任何修改或添加删除操作都会返回一个新的Immutab ...
- 在 react 项目里如何配合immutable在redux中使用
一.reducer文件的处理 先安装 immutable 与 redux-immutable yarn add immutable redux-immutable 我们可能会在很多地方定义子树,这就需 ...
- 清晰理解redux中的
首先需要明白 Redux 的单一状态树的概念,所谓的单一状态树,就是指“所有的 state 都以一个对象树的形式储存在一个单一的 store 中.” 比如我们有这么一个状态树(或者你叫它状态对象也行) ...
随机推荐
- AngularJS学习笔记(一)——一些基本知识
(一)Hello Angular index.html <!DOCTYPE html> <html ng-app> <head> <title>Test ...
- Nodejs使用coffeescript编写的用户注册/登陆代码(MySQL)
记录一下,以备后用 Settings = require '../../settings.js' exports.register = (req, res) -> nick_name = req ...
- MySQL之GROUP BY用法误解
1.说明 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理.(只是简单说明这个 ...
- Android在WebView上构建Web应用程序
原文链接:http://developer.android.com/guide/webapps/webview.html reference:http://developer.android.com/ ...
- 方向梯度直方图(HOG)和颜色直方图的一些比較
近期在学习视频检索领域的镜头切割方面的知识,发现经常使用的方法是直方图的方法,所以才专门有时间来学习下.查看到这两种直方图的时候,感觉有点接近,好像又不同,放在这做个比較.大部分还是百科的内容,只是对 ...
- 实例学习SSIS(三)--使用包配置
原文:实例学习SSIS(三)--使用包配置 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SSIS(四)- ...
- html5 Geolocation(地理位置定位)学习
1.html5 Geolocation html5 Geolocation API 使用很简单,请求一个位置信息,如果用户同意,浏览器会返回一个位置信息,该位置是通过用户的底层设备(手机,电脑) 提供 ...
- Android 发展 ------------- Unable to resolve target 'android-19'
又一次装完Ecplise+ATD+Android SDK 在Ecplise工作空间导入之前写过的Android项目会出现错误,大部分是SDK 版本号不符,例如以下错误提示: Error:Unable ...
- 在Ubuntu上安装 nginx, MySQL, PHP (LEMP),phpmyadmin和WordPress
0)更新 Apt-Get 终端命令:sudo apt-get update 1) 安装php sudo apt-get install php5 2)安装MySql 终端命令: sudo apt-ge ...
- 【值得收藏】数据分析和可视化软件IDL的学习资料汇编【可免费下载】
IDL学习教程 IDL 是一种数据分析和图像化应用程序及编程语言,最初在七十年代后期用于帮助科学家分析火星探险卫星发回的数据.此后,IDL得到广泛运用,使用者日众.IDL能使用户可以迅速且方便地运用此 ...