写这篇文章的时候,我早就在2017年开始实际项目中使用 class
替代 Vuex
了,因此并不用担忧有其余问题,惟一要担忧的就是即将到来的 Vue3.0,若是数据层的赋值再也不是直接对等,而是像 react 中的 this.setState 这种方式去更新数据层的话,那这个方案就凉了。vue
先来看下如下代码react
const a = {
value: 10
}
const b = a;
b.value = 20;
console.log(a, b); // 输出 { value: 20 }, { value: 20 }
复制代码
先来讲下原理:由于JavaScript变量对等赋值的时候,指针指向同一个内存,因此依赖这个特性和 Vue 中赋值是直接对等,就能够自行定义一些全局的状态属性,依次注入到须要同步更新的组件中。废话很少说,直接看代码结构:git
step 1 store.js: 自行定义一个 class 做为数据管理github
class StoreModule{
/** 订单页面列表数据 */
order = {
/** 订单日期 */
date: '2018/12/12 12:12:12',
/** 订单状态 */
state: 1
}
}
/** 全局数据 */
const Store = new StoreModule;
export default Store;
复制代码
step 2 goods.vue: 注意这里不要用 @/ 而是使用相对路径,否则vscode没法代码追踪提示vuex
<script>
import Store from '../module/store';
export default {
data () {
return {
// 页面实例化的时候获取数据
pageData: Store.order
}
}
}
</script>
复制代码
step 3 list.vue 同时用到这个数据的组件编程
<script>
import Store from '../module/store';
export default {
data () {
return {
// 页面实例化的时候获取数据
listData: Store.order
}
},
methods: {
modifyState() {
// 这里修改了,其余引用到 Store.order 全部组件都会同步修改
this.listData.state = 2;
}
}
}
</script>
复制代码
以上这个就是基本的状态管理实现,说下我在项目中用到的状态监听处理:在 StoreModule 这个类里面使用 Object.defineProperty 或者 new Proxy,已经算是比较复杂的了。在 Vuex 中 State、Getter、Mutation、Action、Module这些方法平常只会用到前3种,但对于新手来讲,自定义的class做为状态管理更容易理解,并且扩展性也高。浏览器
最后对比优缺点,优势:代码编辑器(以vs code为例)静态代码追踪提示很是友好(Vuex没法实现,因此我才放弃使用),数据庞大时尤为明显,若是使用TS,配合 readonly、private、enum 等使用,可维护、阅读性简直再舒服不过。缺点:浏览器中调试插件没法使用状态追踪,不过有了静态代码分析检测(仅限TS),也不须要调试插件了。bash
有问题欢迎提出~编辑器
最后附上demo:vue-demoui
博客地址:Hjs' blog