React状态管理:
课前问题思考:
1.为什么不能用window对象?
2.react hooks给状态管理库的设计带来了哪些新思路?
什么是状态管理:
从React诞生之后,前端组件化的方案深入人心,React遵循的是单向数据流的原则,属性通过Props自上而下的传递。当页面的比较简单,组件之间的层级关系比较浅时,这种自上而下的单向数据流的方式是不会有问题的。如果页面一复杂,组件的嵌套层级一深,这种单向数据流的传递方式,将会使你陷入到“嵌套地狱”。
状态管理本身,解决的就是这种“嵌套”地狱的问题,解决的是跨层级组件之间的数据通信和状态共享
为什么React有这么多状态管理工具?
Vue: Vuex(Pinia)
Angular: Service和Rxjs
React: Flux、Redux、Mobx、Rxjs、Recoil、Jotai、Zustand
跟不同前端框架的定义有关, Vue和Angular双向数据绑定,计算属性等,数据是响应式的,
控制视图刷新,拥有计算属性等,这些使得Vue和Angular需要状态管理的场景减少,此外其本身就包含了完整的状态管理工具,比如Vue的Vuex和Pinia,Angular的Service(RXjs)等从官方定调。而React不一样, React是一个纯UI层的前端框架, UI = fn(state),React将状态的变动完全交给开发者。
Local State(props)
import {useState] from 'react'
const Hello = () =>{
const [name , setName] = useState ( ' Jony ' )
return <>Hello,{name}</>
}
Redux的三大原则:单一数据源,只有一个store、store中的state是只读的、使用纯函数来执行修改。
谢积伦9585
1.单一数据源:
在redux中,整个应用的全局State(再次注意是全局state),都会保存在一个store中,一个单一数据源state tree也简化了应用的调试和和监控;它也让你在开发中能将应用数据持久化到本地. 从而加速开发周期。此外,有一些功能
以前很难实现,比如"撤销/重做”,在单一数据源的原则下,使用Redux实现将非常容易。
2.Store中的State是只读的:
我们不能直接修改store中的state, store中的state是只读的。唯一能改变store中的state的方式就是通过action
3.使用纯函数来执行修改:
接受纯函数来接受aciton,该纯函数叫reducer,可以改变store中的state.
因为Redux的上述特性,使得Redux可以做时间旅行。时间旅行:顾名思义,就是可以随时穿越到以前和未来.让应用程序切换到任意时间的状态。因此,如果复杂的场景,特别是存在页面组件间复杂的通信的场景非常适合用Redux来管理状态。
Redux比较适合用于大型Web项目,尤其是一些交互足够复杂、组件通信频繁的场景,状态可预测和回溯是非常有价值的。还有一种场景,比如需要事故重现,这种定义和上报事故异常和重现的场景,Redux也很有意义。
Redux的缺点也很明显,首先为了实现纯函数的Reducer,Redux必须处理各种各样的副作用,需要引入一系列的副作用中间件.加重的心智负担,此外Action,Dispatch,Reducer的模式需要写过多的样版代码,虽然通过React hooks和Redux toolkit可以减少一定的样板代码,但是复杂度还是摆在哪里。因此中小项目,也不太推荐使用Redux,可能Context或者React hooks中的useReducer就能满足你的需求。