React状态分类:
- Local State(useState、useReducer、setState)
- Context
- 第三方状态管理器
1、单向数据流Redux(基于Redux相对好用的库:Rematch、Redux Toolkit)
2、有限状态机XState(状态管理器中的"瑞士军刀",擅长处理复杂场景)
3、响应式数据流MobX
4、原子模式Recoil
这一章主要介绍LocalState上的一些思考:
首先来看下什么是状态?
React的核心思想是组件化思想,对于组件最重要的是state,React重新渲染页面时,是依据State去渲染页面,所以我们只需要更新state,即可实现页面的渲染始终和state保持一致。
可以看出state是组件的UI数据模型,是组件渲染的重要依据,在React中扮演着重要的角色;
Local State
useState、setState
具体用法就不介绍了,想必大家用的比我都熟=。=;
特性:伪异步;(React合成事件中时"异步",原生事件中是同步);
useReducer
React官方定义:useState的替代方案。
//const [state, dispatch] = useReducer(reducer, initState, init);
const reducer = (state, action) => {
switch(action.type){
case 'request':
return {
loading: true
}
case 'success':
return {
loading: false
}
default:
break;
}
}
const initState = {
loading: false
}
export default (props) => {
const [state, dispatch] = useReducer(reducer, initState, init);
// dispatch({type: 'request'})
// dispatch({type: 'success'})
return null;
}
useReducer和useState的区别
-
useReducer相比useState,更容易描述状态如何变化,更容易复用对状态的处理逻辑;
-
useReducer相比useState,写起来相对麻烦,需要定义type,代码量会有一定的增加;
使用场景
- state层级深(另一个维度层级深可能是state设计不合理);
- 状态更新复杂经常一个操作更新一系列state;
- 需要跨组件更新父级组件状态时,可以将dispatch传递而不是传递回调函数;
(React 会确保 dispatch 函数的标识是稳定的,并且不会在组件重新渲染时改变)
值得思考的问题:
1、useReducer+useContext能够替代Redux吗?
-
useContext的问题是如果数据发生变化,整个子树都会重新渲染,性能可能会有问题;
-
除了性能问题,useReducer在处理异步问题上还得引入第三方库,相比已经有成熟社区的Redux,不如Redux用起来更顺手;
2、为什么大多数人项目中很少使用useReducer?
- useReducer写起来比较啰嗦,会产品一坨模板代码,在简单场景有种头重脚轻的感觉,虽然相对Redux已经足够轻量了,但是在这方面同样存在着啰嗦的问题;
- 大型项目中或者复杂场景我们都会考虑引入第三方状态管理器Redux、MobX等;