8记账 Vue 项目-Vue 全局数据管理(上)

101 阅读2分钟

8.1 再次封装recordListModel

如何让两个页面的数据同步,用全局数据管理

money.vue是从tagListModel里去取数据

image.png

label.vue的从recordListModel里去取的数据

const recordList = recordListModel.fetch();

全局数据管理 先把两个model统一一下,重新封装recordListModel 记了一笔账,统计就显示出来了

封装create (因为每次新增过程又用clone,又要push) image.png

image.png

封装clone

最好建个.ts全局引入

image.png

image.png

8.2 用 window 来容纳数据

上面两个money.vue,label.vue 从同一个对象分别生成了对象1,和对象2

为了优化

可以上提到App.vue  ,
最好提到更上一层main.ts上
在main.ts上获取对象,传给money.vue,label.vue

在main.ts里声明会报错,要声明window上tagList属性

因此全局声明将tag属性都复制到custom.ts中

然后Money.vueLabel.vue都不用自己fetch数据,而是通过window.tagList去获取

8.3 用window来封装API 1

统一create 创建create全局接口 不需要知道taglistModel 封装createTag

image.png

image.png

同理封装removeTag和updateTag、findTag

removeTag

image.png

updateTag

image.png

findTag

image.png

image.png

8.4 用window来封装API 2

对recordListModel进行封装

image.png

image.png

image.png

8.5 消除对window的依赖

封装好后导致 1、全局变量太多 2、严重依赖window

消除对 window 的依赖:把所有变量挂到window.store上面

image.png

image.png

解决对window的依赖,新建index2.ts

将整个store复制进去

新建recordStore和tagStore分别将store的内容分别复制进去

再在store里去引入 把Money.vue,Labels.vue,EditLabel.vue里使用的window都换成store 新建recordStore和tagStore分别将store的内容分别复制进去 再在store里去引入 去掉recordListModel将其内容都放入recordStore里 同理也去掉tagListModels

8.6 将model融合进store

8.7 修复Tags.vue的bug

8.8 store的bug之值与地址

解决Money页面新增标签的bug

由于全局数据管理 无需从外部获取数据

其中store里会有值传递(string/number/boolen)和地址传递(Object(array,function)) 的问题

count复制的是值,当store.count发生变化与count无关

解决方法不用data去获取数据,改用computed

8.9 小技巧:把store2编程this.$store2

全局状态管理(也叫全局数据管理)的好处是什么?
解耦:将所有数据相关的逻辑放入 store(也就是 MVC 中的 Model,换了个名字而已)
数据读写更方便:任何组件不管在哪里,都可以直接读写数据
控制力更强:组件对数据的读写只能使用 store 提供的 API 进行(当然也不排除有猪队友直接对 tagList 和 recordList 进行 push 等操作,这是没有办法禁止的)