什么是状态?在代码的世界里,状态就是指数据,简单的理解:你现在的情绪状态是怎样的? “高兴”,“悲伤”,这就是描述你当前情绪状态的数据。
抽象到一个描述用户的Vue组件,当前登录的用户的头像和昵称,就是这个组件的状态(数据);
从字面意思理解就是,在系统任意地方都可以调用的数据(类似全局变量的概念)。
全局变量,一般特指系统内任意代码位置都可以调用的变量;
JS有很多实现全局变量,或者类似全局变量的方法:传统的直接在window对象上定义、AMD模块化时在模块内定义然后将模块对象暴露给window,Es6下操作公共的模块;
现在是Es6的时代,所以我们讨论一下Es6的模块(JS至今的模块化规范都有这些特性);
所以通过模块去实现易于管理的全局变量,是非常容易的。
Vue拥有Vuex、pinia两款非常优秀的全局状态管理器,在项目开发中基本是标配了。自从有了它们之后,我们习惯性的将所有全局状态都通过它们来组织使用。
观点
需要响应式的变量用全局状态管理器、不需要响应式的用模块封装;
先来看看Vuex官网的说明:
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。这个状态自管理应用包含以下几个部分:
可以看出vuex主要是为了更加友好的管理需要全局响应式的数据,通过它定义的所有数据,都会进行数据代理;
在实际的业务中,有时候我们需要的只是一个全局变量,并不需要它具有响应式的特性。在这种情况下是否还要通过Pinia、Vuex来管理呢?
假设有一个低代码平台的页面编辑器,需要实现修改后可以撤回,撤回后可以恢复的功能;
页面组成如下:
对于这个修改、撤回的功能,我们可以单独拎出来,作为一个独立模块,而不是通过全局状态管理器,分析:
条件:
当页面状态比较多的时候,通过上面的方式进行实现,会减少很多用不到的get、set,并且易用性、可维护性也是不差的;相信类似的需求场景还有很多,从这个角度来看,还是具有一定参考价值的。
本文只是个人观点,不具有通用性,仅供参考;