Skip to content

状态管理

在函数的世界中,为了能够达到纯洁,我们引入了纯函数,纯函数没有副作用,没有状态的变化,但是纯函数并不能解决所有的问题,比如我们需要在某个时刻记录一些状态,比如用户登录状态,购物车状态等等,这些状态的变化需要被记录下来,但是又不能影响纯函数的执行,所以我们需要引入状态管理。

状态管理的基本概念

状态管理的基本概念包括:

  • 状态:程序运行时的数据,包括变量、对象、数组等。
  • 生命周期:状态具有 4 个生命周期,创建、读取、修改、销毁。

状态管理的核心思路就是使用容器维护变量的生命周期,并向下游提供统一的 API,下游不再直接声明、读取、修改、销毁数据,必须经过状态管理容器的 API 来访问数据。

状态的生命周期

状态的生命周期包括:

  • 创建:init,创建状态,包括变量的初始化、对象的创建、数组的初始化等。
  • 读取:get,通过纯函数来访问状态。
  • 修改:set,通过纯函数来修改状态。
  • 销毁:drop,销毁状态,包括变量的销毁、对象的销毁、数组的销毁等。

一个操作对应 2 个切点,共 8 个切点,状态管理容器需要在这 8 个切点中进行拦截,添加额外的逻辑进行处理,从而保证数据的安全。下游的代码只需要考虑读取状态和修改状态即可,而不需要考虑创建和释放状态。

衍生状态

衍生状态是指依赖于其他状态,在其他状态地基础上经过进一步计算得到的状态,当其他状态发生变化时,衍生状态也需要发生变化。衍生状态往往可以通过纯函数来计算,从而简化衍生状态的逻辑。

状态订阅

状态订阅属于响应式编程的技术,达到自动广播变化的目的,避免由程序员手动同步数据变化。当状态发生变化时,通知相关的副作用函数,使得副作用在用户进行输入的时候发生,而不是我们的程序主动发出的副作用。

订阅主要是订阅 set 和 drop,因为这两个函数会改变状态,所以需要通知相关的副作用函数和衍生状态重新执行。

自动订阅和手动订阅,手动订阅需要用户手动调用 API 来指定订阅的数据,而自动订阅通过拦截状态读取时的操作,并且或者当前的关联函数,将被读取的变量和关联的函数自动进行绑定,当变量发生变化的时候,自动触发该管理函数。