状态是什么?首次接触这个概念时,很多人会懵,数据是状态吗?
状态,应该从面向对象的角度来理解。比如我们在介绍一个具体的人时,会说“他叫小明,今年18岁”,“他”是一个具体的对象,有“姓名”和“年龄”两个属性,而“姓名=小明,年龄=18”,就是“他”这个对象的状态。你说,状态就是数据,也不能说你错,但还是要针对具体对象来说。比如“年龄=18”,如果脱离了“他”这个对象,就失去了它的描述涵义。
状态管理,则可以认为就是管理对象属性的Value。对于Vue和Blazor来说,表现为对组件视觉层的标签属性值或逻辑层的字段值的管理。我们之前学习的,为标签属性赋值,或绑定逻辑层的变量值、父传子、子传父等,都是在管理组件状态。而在进阶段,我们将范围再拉窄一些,主要学习组件之外状态的共享,以及状态的持久化保存问题。
状态共享。主要解决这样一个场景,组件A、组件B......,共享一个数据,在任意一个组件中修改这个共享数据时,其它组件中绑定这个数据的状态同步更新,也可以认为是组件间的数据传递,无论是组件是父子还是兄弟关系。Vue中,通过Vuex或Pinia插件来实现,而Blazor则通过依赖注入。两者的底层原理,都是应用启动后,创建一个生命周期为整个应用范围的对象,这个对象持有共享数据。状态管理的第二节,我们将主要学习Vue的Pinia和Blazor的依赖注入/单例。需要注意的是,依赖注入是Asp.net Core的核心模块,我们只是通过依赖注入来实现状态共享,而Pinia是专门用来管理共享状态的。
状态的持久化保存,我们使用Pinia或依赖注入/单例时,都是单例模式,应用关闭时,对象销毁,数据自然就消失了。如果重新启动应用时,还想要获得旧的数据,如购物车中的数据,应该怎么办?我们首先会想,把数据存到数据库里吧,但如果客户端很多,每个客户端都要读写数据,数据库服务器的压力会很大。所以,更好的方案是将数据存在客户端,退出应用前,将数据存入客户端,重新打开应用时,再从客户端读取数据,这样即充分利用了客户端资源,又能一定程度保护客户信息。而客户端保存持久化数据的方案有以下几种:cookie、storage、SQLite(手机自带),我们将在状态管理的第三节学习。注:说到cookie时,都会谈及session,这是一个比较容易搞混的概念,界时也会尝试理清。
【文章原创作者:美国服务器 https://www.68idc.cn处的文章,转载请说明出处】