浅谈前端状态管理库

218 阅读4分钟

一 react状态管理

react从redux,mobx 到和umi深度捆绑的dvajs(目前已经停止维护),再到轻量级Zustand ,学习成本显著降低,底层原理借助useSyncExternalStore

1 dvajs

dva.js 是基于 redux、redux-saga 和 react-router 的,因此在开始使用 dva.js 之前,需要对这些库有一定的了解,这增加了学习成本。 dvajs官网好像被劫持了......

dva不支持 Typescript

2、Zustand 的优势

  1. 轻量级 :Zustand 的整个代码库非常小巧,gzip 压缩后仅有 1KB,对项目性能影响极小。Zustand 的体积更小,仅为 1KB,而 Redux 的体积为 7KB。
  2. 简洁的 API :Zustand 提供了简洁明了的 API,能够快速上手并使用它来管理项目状态。 基于钩子: Zustand 使用 React 的钩子机制作为状态管理的基础。它通过创建自定义 Hook 来提供对状态的访问和更新。这种方式与函数式组件和钩子的编程模型紧密配合,使得状态管理变得非常自然和无缝。
  3. 易于集成 :Zustand 可以轻松地与其他 React 库(如 Redux、MobX 等)共存,方便逐步迁移项目状态管理。 多环境集成( react内外环境联动 )实际的复杂应用中,一定会存在某些不在react环境内的状态数据,以图表、画布、3D场景最多。一旦要涉及到多环境下的状态管理,可以让人掉无数头发。而zustand已经考虑到了,useStore 上直接可以拿值。 通过 getState() 和 setState() 可以在任何地方调用 和 处理 zustand 的状态
  4. 支持 TypeScript:Zustand 支持 TypeScript,让项目更具健壮性。
  5. 灵活性:Zustand 允许根据项目需求自由组织状态树,适应不同的项目结构。
  6. 可拓展性 : Zustand 提供了中间件 (middleware) 的概念,允许你通过插件的方式扩展其功能。中间件可以用于处理日志记录、持久化存储、异步操作等需求,使得状态管理更加灵活和可扩展。
  7. 性能优化: Zustand 在设计时非常注重性能。它采用了高效的状态更新机制,避免了不必要的渲染。同时,Zustand 还支持分片状态和惰性初始化,以提高大型应用程序的性能。
  8. 无副作用: Zustand 鼓励无副作用的状态更新方式。它倡导使用 immer 库来处理不可变性,使得状态更新更具可预测性,也更易于调试和维护。

二 vue状态管理

vue从vuex到pinia,目前pinia为官方推荐替代vuex的状态管理工具

1. vuex

image.png

image.png

image.png

image.png

2. pinia

Pinia和Vuex都是Vue.js的状态管理库,它们之间的区别可以从以下几个方面进行归纳:

  1. 与Vue版本的兼容性

    • Vuex:主要用于Vue 2,虽然也可以用于Vue 3,但需要使用Vuex 4.x版本。
    • Pinia:专为Vue 3开发,充分利用了Vue 3的Composition API,不提供对Vue 2的支持。
  2. 状态管理的方式

    • Vuex:遵循单一状态树的概念,将所有应用状态存储在一个全局的store中。通过actions、mutations和getters来修改和获取状态,具有严格的规则保证状态以一种可预测的方式发生变化。
    • Pinia:采用更加模块化的方法来管理状态,每个模块(store)都有自己的状态、操作和getters。这种方式使得代码更加分散且自包含,降低了复杂性。
  3. 异步操作的处理

    • Vuex:异步操作通常需要在actions中处理,这可能导致代码相对冗长。
    • Pinia:支持在模块中使用async/await来更轻松地处理异步操作,使代码更加清晰。
  4. TypeScript支持

    • Vuex:在处理类型和TypeScript支持方面相对较弱,虽然可以使用TypeScript,但需要额外的工作。
    • Pinia:专门为TypeScript设计,具有更强大的类型支持。它充分利用了Vue 3的Composition API的类型推断,使得开发者可以更容易地编写类型安全的代码。
  5. 使用场景

    • Vuex:适合大型、复杂的Vue应用,尤其是那些需要严格遵循Flux架构原则的应用。Vuex的严格性和规范性使得它成为管理复杂状态的首选。
    • Pinia:适合Vue 3项目,特别是那些希望采用Composition API进行开发的项目。Pinia的灵活性和模块化使得它成为Vue 3项目中状态管理的理想选择。

综上所述,Pinia和Vuex在兼容性、状态管理方式、异步操作处理、TypeScript支持以及使用场景等方面存在明显的差异。开发者在选择时应根据项目的具体需求和技术栈来做出决策。