主要讲解一下前端为什么需要进行数据管理,有效的数据管理应该是什么样子的,最后挑选Flux、Redux、Vuex进行对比讲解。


为什么要进行数据管理?

组件式开发的核心思路是MVC,Model层的数据发生变化,驱动View层的视图发生变化。试想一个场景,如果ModelA触发ModelB变化,导致ViewB发生变化,ViewB发生变化时,触发了ModelC变化,ModelC又触发了其他Model的变化...,我们想知道一个View的变化究竟是那个数据导致的,追查起来就很困难,于是就记录数据的变化就很有必要了,其实换一个高大上的名字就是数据状态管理。

怎么有效地进行数据管理?

1. 数据集中管理
view中的数据统一放置到一个仓库(store)中,要渲染页面的时候,从中取出当前状态的数据(state),然后将state中的最新的数据通过props传递到组件中,然后渲染组件,实现试图展现。

2. 精细化拆解数据操作
要修改store中的state,为了做到数据的操作可追溯,尽量将数据的操作拆解成一个个小函数,当然纯函数最好。

3. 单向数据驱动
组件中不能直接修改state的值,修改state,只能发出修改请求(action),由action触发数据操作。

总之,数据集中管理就需要应用使用唯一的数据Tree,存放在store中;精细化拆解数据操作就是需要提供小而纯的函数,来修改state;单就向数据驱动需要提供唯一能修改state的渠道

数据管理工具

1. Flux

Flux数据流的顺序是:
View发起Action->Action传递到Dispatcher->Dispatcher将通知Store->Store的状态改变通知View进行改变

ps:基于Flux架构思想写的一个小demo

2. Redux

Redux相对于Flux的改进:

  • 把store和Dispatcher合并,结构更加简单清晰

  • 新增state角色,代表每个时间点store对应的值,对状态的管理更加明确

Redux数据流的顺序是:
View调用store.dispatch发起Action->store接受Action(action传入reducer函数,reducer函数返回一个新的state)->通知store.subscribe订阅的重新渲染函数

ps:阮一峰老师的Redux+React小demo

3. Vuex

Vuex是专门为Vue设计的状态管理框架,
同样基于Flux架构,并吸收了Redux的优点
Vuex相对于Redux的不同点有:

  • 改进了Redux中的Action和Reducer函数,以mutations变化函数取代Reducer,
  • 无需switch,只需在对应的mutation函数里改变state值即可
  • 由于Vue自动重新渲染的特性,无需订阅重新渲染函数,只要生成新的State即可

Vuex数据流的顺序是:
View调用store.commit提交对应的请求到Store中对应的mutation函数->store改变(vue检测到数据变化自动渲染)

ps:vuex官方Vue+vuex小demo

使用数据管理工具的场景

数据管理主要是方便SPA开发时,管理多个组件或子页面的公用数据,如果仅仅是简单个的单页,您最好不要使用Redux或Vuex。

相关资料

redux官方文档:https://cn.redux.js.org/
redux视频:https://www.youtube.com/watch?v=VJ38wSFbM3A

vuex官方文档:https://vuex.vuejs.org/zh/

flux阮一峰文档:http://www.ruanyifeng.com/blog/2016/01/flux.html

最新文章

  1. html+ccs3太阳系行星运转动画
  2. echarts之字符云tooltip显示混乱问题的解决办法
  3. 剑指Offer:面试题26——复制复杂的链表(java实现)
  4. Step deep into GLSL
  5. Citrix 服务器虚拟化之八 Xenserver虚拟机模版
  6. Careercup - Facebook面试题 - 5671785349513216
  7. 在Windows下编译FFmpeg详细说明
  8. 转:C++中多态是怎样实现的?
  9. Java正则过滤
  10. Day24 中间件 自定义分页 ModelForm 序列化 缓存 信号
  11. mysql 修改表结构、表字段注释语句
  12. 迭代与JDB
  13. java.lang.NullPointerException 错误原因
  14. Docker:单机编排工具docker-compose [十二]
  15. OSI,TCP/IP,五层协议的体系结构,以及各层协议
  16. linux 解压缩总结
  17. Tyvj 1518 CPU监控——极恶线段树
  18. vs2015配置OpenGL开发环境
  19. 面向对象课程 - 寒假第三次作业 - C++计算器项目初始部分
  20. 调整Linux的最大文件打开数

热门文章

  1. 为 Mac Finder 增加右键文件打包压缩(免费)
  2. 继承之重写prototype
  3. 使用Python破解验证码
  4. MyBatis有关resultType和resultMap差异
  5. TCP 三次握手(相当于寄信需要回执,第一次握手:我寄给你一封信。第二次握手:你回我一封信。第三次握手:我再给你一个回执,这样你才能确认我收到信了)
  6. 在Docker中创建Mongo容器的后续设置
  7. OpenSSL RSA加解密 (.Net公钥加密/ Linux端私钥解密)
  8. WPF编游戏系列 之八 银行界面及金额校验
  9. ASP.NET MVC 学习笔记1 Talk about controller & route
  10. GAC的一种非官方实现方式