React状态思考(一)__巩固React状态基础

304 阅读2分钟

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等;