redux 的三大原则
redux
的开发和使用必须要遵循三大原则,即:
- 单一数据源:整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中
- State 是只读的:唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。
- 使用纯函数来执行修改: 为了描述 action 如何改变 state tree ,你需要编写 reducers
关于第一点很容易理解,整个应用应当只有一个 store
,全局唯一的 store
有利于更好的管理全局的状态,方便开发调试,对实现“撤销”、“重做”这类的功能也更加方便。
第二点,state
是只读的,因此,我们在任何时候都不应该直接修改 state
,唯一能改变 state
的方法就是通过 dispatch
一个 action
,间接的来修改,以此来保证对大型应用的状态进行有效的管理。
第三点,要想修改 state
,必要要编写 reducer
来进行,reducer
必须是纯函数,reducer
接收先前的 state
和 action
,并且返回一个全新的 state
。
什么是纯函数?
前面我们介绍 redux
三大原则的时候提到过,修改 state
要编写 reducer
,且 reducer
必须是一个纯函数,那么问题来了,什么是纯函数呢?
维基百科里是这么定义纯函数的:
在程序设计中,若一个函数符合以下要求,则它可能被认为是纯函数
- 此函数在相同的输入值时,需产生相同的输出。函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关。
- 该函数不能有语义上可观察的函数副作用,诸如“触发事件”,使输出设备输出,或更改输出值以外物件的内容等。
简单总结一下,如果一个函数的返回结果只依赖他的参数,并且在执行过程中没有副作用,我们就把这个函数定义为纯函数。
举个