状态管理--XState、MobX

简介: 本文适合对状态管理库感兴趣的小伙伴阅读

一、前言


本文基于开源项目:

https://github.com/statelyai/xstate

https://xstate.js.org/docs/

https://github.com/mobxjs/mobx

https://mobx.js.org/api.html

 

广东靓仔用过不少状态管理的库,这里给小伙伴们简单介绍下XState、MboX。    XState与MobX经常与React结合使用,当然也有vue结合使用的,两种都可以称得上是强力组合,业界有很多很多的案例。


下面我们来看看XState与MobX


二、XState


简单介绍

   官方介绍:用于现代web的 JavaScript 和 TypeScript 有限状态机和状态图。    


简单来说就是用于创建、解释和执行有限状态机和状态图。


  • xstate 有限状态机和状态图库 + 解释器
  • @xstate/fsm 最小有限状态机库
  • @xstate/graph XState 的图遍历实用程序
  • @xstate/react 在 React 应用程序中使用 XState 的 React 钩子和实用程序
  • @xstate/vue 用于在 Vue 应用程序中使用 XState 的 Vue 组合函数和实用程序
  • @xstate/svelte 用于在 Svelte 应用程序中使用 XState 的 Svelte 实用程序
  • @xstate/test 用于测试任何软件的基于模型的测试实用程序(使用 XState)
  • @xstate/inspect XState 的检查实用程序

快速使用

安装

npm install xstate


也可以直接引入


<script src="https://unpkg.com/xstate@4/dist/xstate.js"></script>


Demo

import { createMachine, interpret } from 'xstate';
// 定义无状态Machine
// 解释器使用的纯函数
const toggleMachine = createMachine({
  id: 'toggle',
  initial: 'inactive',
  states: {
    inactive: { on: { TOGGLE: 'active' } },
    active: { on: { TOGGLE: 'inactive' } }
  }
});
// 内部状态
const toggleService = interpret(toggleMachine)
  .onTransition((state) => console.log(state.value))
  .start();
// => 'inactive'
toggleService.send('TOGGLE');
// => 'active'
toggleService.send('TOGGLE');
// => 'inactive'


有限状态机

常见的三个特征:

  • 状态总数(state)是有限的。
  • 任一时刻,只处在一种状态之中。
  • 某种条件下,会从一种状态转变(transition)到另一种状态。

在实际开发中,需要三点:

  • 初始状态
  • 触发状态变化的事件和转换函数
  • 最终状态的集合(有可能是没有最终状态)

Interpreting Machines

广东靓仔从文档截了个图,如下所示:

image.png


通常在实际开发,我们需要做以下操作:

  • 跟踪当前状态,并将其持久化
  • 执行副作用
  • 处理延迟的转换和事件
  • 与外部服务通信

import { createMachine, interpret } from 'xstate';


我们可以使用这个解释器做如下操作:

  • 状态转换
  • 执行操作(副作用)
  • 取消的延迟事件
  • 正在进行的行动
  • 调用/生成子状态图服务
  • 支持状态转换、上下文更改、事件等的多个侦听器。

计数器案例

import { createMachine, interpret, assign } from 'xstate';
const increment = (context) => context.count + 1;
const decrement = (context) => context.count - 1;
const counterMachine = createMachine({
  initial: 'active',
  context: {
    count: 0
  },
  states: {
    active: {
      on: {
        INC: { actions: assign({ count: increment }) },
        DEC: { actions: assign({ count: decrement }) }
      }
    }
  }
});
const counterService = interpret(counterMachine)
  .onTransition((state) => console.log(state.context.count))
  .start();
// => 0
counterService.send('INC');
// => 1
counterService.send('INC');
// => 2
counterService.send('DEC');
// => 1

关于XState的内容远不止于此,感兴趣的小伙伴前往官网进行学习


三、MobX


简单介绍

官方介绍:Mobx通过透明的函数响应式编程(transparently applying functional reactive programming - TFRP)使得状态管理变得简单和可扩展。


广东靓仔从官网找了一张图,如下所示:

image.png


Mobx背后执行的操作,一目了然。


通常我们使用React 和 MobX 来开发我们日常项目:

  • React 通过提供机制把应用状态转换为可渲染组件树并对其进行渲染
  • MobX提供机制来存储和更新应用状态供 React 使用

核心三步

定义State(状态)并使其可观察

import {observable} from 'mobx';
var appState = observable({
    timer: 0
});


采用任意的数据结构来存储状态即可,如对象、数组、类。循环数据结构、引用。


创建视图以响应状态的变化

import {observer} from 'mobx-react';
@observer
class TimerView extends React.Component {
    render() {
        return (
            <button onClick={this.onReset.bind(this)}>
                Seconds passed: {this.props.appState.timer}
            </button>
        );
    }
    onReset() {
        this.props.appState.resetTimer();
    }
};
ReactDOM.render(<TimerView appState={appState} />, document.body);


任何函数都可以成为可以观察自身数据的响应式视图,MobX 可以在任何符合ES5的JavaScript环境中应用。


更改状态--Actions(动作)

appState.resetTimer = action(function reset() {
    appState.timer = 0;
});
setInterval(action(function tick() {
    appState.timer += 1;
}), 1000);


官方温馨提示:只有在严格模式(默认是不启用)下使用 MobX 时才需要 action 包装。建议使用 action,因为它将帮助你更好地组织应用,并表达出一个函数修改状态的意图。同时,它还自动应用事务以获得最佳性能。


MobX提供了一些工具函数,如下图所示:

image.png


四、总结


   在我们阅读完官方文档后,我们一定会进行更深层次的学习,比如看下框架底层是如何运行的,以及源码的阅读。


   这里广东靓仔给下一些小建议:

  • 在看源码前,我们先去官方文档复习下框架设计理念、源码分层设计
  • 阅读下框架官方开发人员写的相关文章
  • 借助框架的调用栈来进行源码的阅读,通过这个执行流程,我们就完整的对源码进行了一个初步的了解
  • 接下来再对源码执行过程中涉及的所有函数逻辑梳理一遍
相关文章
|
25天前
|
存储 JavaScript 前端开发
除了 Vuex,还有以下一些常见的状态管理库
【10月更文挑战第18天】随着技术的不断发展和演进,新的状态管理库也可能不断涌现,我们需要保持关注和学习,以适应不断变化的开发需求。
37 1
|
6月前
|
JavaScript
状态管理(pinia)
状态管理(pinia)
46 0
|
17天前
|
资源调度 JavaScript 前端开发
使用 Redux 进行状态管理
【10月更文挑战第26天】从定义 Action 和 Reducer,到创建 Store,再到将 Redux 与 React 组件进行连接,以及处理异步操作,Redux 提供了一种清晰、可预测的方式来管理应用程序的状态,使得应用的状态变化更加易于理解和维护,尤其适用于大型复杂的应用开发。在实际使用过程中,还可以根据项目的具体需求,进一步优化 Redux 的使用,如使用 `redux-immutable` 来处理不可变数据、使用 `redux-devtools` 进行调试等,以提高开发效率和应用性能。
33 9
|
27天前
|
存储 JavaScript
Vuex 状态管理
【10月更文挑战第15天】总的来说,Vuex 是 Vue.js 应用中非常重要的状态管理工具,它可以帮助我们更好地管理应用的状态,提高开发效率和代码质量。通过深入了解和正确使用 Vuex,我们可以构建出更加复杂和高效的 Vue.js 应用。
|
2月前
|
JavaScript 前端开发
Hooks使用useReducer、createContext 、useContext实现模块数据共享,类似全局状态管理但不推荐做全局管理
使用React的`useReducer`和`createContext`钩子实现模块间的数据共享,类似于全局状态管理,但不推荐用作全局状态管理。`useReducer`适用于复杂的状态逻辑,而`createContext`和`useContext`则用于跨组件传递数据。
38 1
|
6月前
|
存储 JavaScript 前端开发
【第36期】一文学会Redux状态管理
【第36期】一文学会Redux状态管理
114 0
|
3月前
|
存储 JavaScript 开发者
Vuex是如何帮助我们管理状态的
Vuex通过一系列核心概念和规则,帮助我们有效地管理和维护Vue.js应用程序中的状态。
16 4
|
3月前
|
前端开发 JavaScript API
react 常用的状态管理
【8月更文挑战第29天】react 常用的状态管理
55 1
|
6月前
|
JavaScript 测试技术
状态管理:集成 Vuex 进行全局状态管理
【4月更文挑战第22天】Vuex 是 Vue.js 的状态管理库,通过状态、mutations、actions 和 modules 等核心概念集中管理应用状态。创建 store,划分模块以增强代码维护性。mutations 同步改变状态,actions 处理异步逻辑。遵循 Vuex 规范,在组件中使用辅助函数访问状态。有效更新和处理错误,实现与其它工具集成,提升应用性能和可靠性。注意根据项目需求灵活使用,防止状态管理过度复杂。
50 2
|
6月前
|
资源调度 JavaScript
如何使用 Vuex 管理应用的状态?
如何使用 Vuex 管理应用的状态?
31 3