vuex持久化存储的方式?刷新页面后数据就消失了

seosqwseo3个月前 (09-02)测评日记36

一、超详细!Vuex手把手教程

近在重温vue全家桶,再看一遍感觉记忆更深刻,所以专门记录一下(本文vuex版本为v3.x)。

Vuex是专为Vue.js开发的状态管理模式。它采用集中式存储,管理所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化(我的理解就是全局变量)。

state

对象类型,类似于实例的 data属性,存放数据

getters

对象类型,类似于实例的计算属性 computed

mutations

对象类型,类似于实例的 methods,但是不能处理异步方法

actions

对象类型,类似于实例的 methods,可以处理异步方法

modules

对象类型,当state内容比较多时,通过该属性分割成小模块,每个模块都拥有自己的 state、mutation、action、getter

存储在 state中的数据和 Vue实例中的 data遵循相同的规则,必须是纯粹的对象。

getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,并且默认接受 state作为其第一个参数,也可以接受其他 getter作为第二个参数(如下例)

通过调用 this.$storemit('xxx'),调用 mutation中的方法,更改 store中的值

新建文件 mutation-types.js,定义方法名的常量,并导出

在store中

在组件中

注意, Action提交的是 mutation,而不是直接变更状态,并且可以包含任意异步*作

或者

Action接受一个与 store实例具有相同方法和属性的 context参数对象,因此你可以调用 contextmit提交一个 mutation,或者通过 context.state和 context.getters来获取 state和 getters,利用 ES6的解构,可以简化写法。

在vuex中

在组件中使用 async/ await或者 then/ catch处理异步

当应用变得非常复杂时, store对象就可能变得相当臃肿。这时候可以将 store分割成模块,每个模块拥有自己的 state、 mutation、 action、 getter、甚至是嵌套子模块,从上至下进行同样方式的分割。

在store目录下新建 Modules文件夹,在 Modules文件夹中新建 modulesA.js, modulesB.js,如下图

在modulesA.js中写上局部模块的 state、 mutation、 action、 getter,并导出

然后在 store的 index.js中引入,并丢进 modules对象里

在组件中直接使用

在组件中使用 mapState映射

在组件中直接使用

在组件中使用 mapState映射

模块内部的 getter,接受的参数 state和 getters是模块的局部状态对象,而根节点的状态会作为第三个参数 rootState暴露出来

如果需要带参数

在组件中直接使用

在组件中使用 mapMutations映射

模块内部的 mutations,默认接受的第一个参数 state是模块的局部状态对象

如果需要带参数

在组件中直接使用

在组件中使用 mapActions映射

或者重命名

对于模块内部的 action,局部状态通过 context.state暴露出来,根节点状态则为 context.rootState

默认情况下,模块内部的 action、 mutation和 getter是注册在全局命名空间的,这样使得多个模块能够对同一 mutation或 action作出响应。如果希望模块具有更高的封装度和复用性,可以通过给模块添加 namespaced: true的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、 action及 mutation都会自动根据模块注册的路径调整命名。

先在模块 moduleB.js中添加 namespaced: true

在 store的 index.js中

如果在组件中使用命名空间,需要带上空间名称, mapState, mapGetters, mapMutations, mapActions用法一样。

如果你希望使用全局的 state和 getter, rootState和 rootGetters会作为第三和第四参数传入 getter,也会通过 context对象的属性传入 action。若需要在全局命名空间内分发 action或提交 mutation,将{ root: true}作为第三参数传给 dispatch或 commit即可

在带命名空间的模块注册全局 action,需要添加 root: true,并将这个 action的定义放在函数 handler中,其中,handler的第一个参数 namespacedContext就是 action中的 Context参数

如果看了觉得有帮助的,我是@鹏多多11997110103,欢迎点赞关注评论;

END

往期文章

个人主页

二、vuex页面刷新后无法保存数据怎么处理

这次给大家带来vuex页面刷新后无法保存数据怎么处理,处理vuex页面刷新后无法保存数据的注意事项有哪些,下面就是实战案例,一起来看一下。

1.原因

2.解决方法

localStorage没有时间期限,除非将它移除,sessionStorage即会话,当浏览器关闭时会话结束,有时间期限,具有自行百度

我这里使用sessionStorage,这里需要注意的是vuex中的变量是响应式的,而sessionStorage不是,当你改变vuex中的状态,组件会检测到改变,而sessionStorage就不会了,页面要重新刷新才可以看到改变,所以应让vuex中的状态从sessionStorage中得到,这样组件就可以响应式的变化

3.具体实现

应用背景是用户登入后保存状态,退出后移除状态

mutations.js

ADD_LOGIN_USER(state,data){//登入,保存状态

sessionStorage.setItem("username", data);//添加到sessionStorage

sessionStorage.setItem("isLogin",true);

state.username=data,//同步的改变store中的状态

state.isLogin=true

},

SIGN_OUT(state){//退出,删除状态

sessionStorage.removeItem("username");//移除sessionStorage

sessionStorage.removeItem("isLogin");

state.username=''//同步的改变story中的状态

state.isLogin=false

}getters.js

isLogin(state){

if(!state.isLogin){

state.isLogin=sessionStorage.getItem('isLogin');//从sessionStorage中读取状态

state.username=sessionStorage.getItem('username');

}

return state.username

}总体的实现思路是让vuex中story的状态和sessionStorage保持一致(从sessionStorage取值)

4.后话

之前踩了一个大坑,没注意到vuex可以让组件响应式变化,让组件直接取了sessionStorage的值,弄的我还必须刷新才能看到退出后的效果。

补充:

下面看戏vuex存储和本地存储(localstorage、sessionstorage)的区别

1.重要的区别:vuex存储在内存,localstorage则以文件的方式存储在本地

2.应用场景:vuex用于组件之间的传值,localstorage则主要用于不同页面之间的传值。

3.永久性:当刷新页面时vuex存储的值会丢失,localstorage不会。

注:很多同学觉得用localstorage可以代替vuex,对于不变的数据确实可以,但是当两个组件共用一个数据源(对象或数组)时,如果其中一个组件改变了该数据源,希望另一个组件响应该变化时,localstorage无法做到,原因就是区别1。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

JS怎样使二维数组行列转化

redux-thunk实战项目案例详解

三、vuex的数据刷新之后还在吗,怎么做持久化

路由刷新是无刷新跳转,表面看起来就像是一个app应用,表现效果就像你写的 tab选项卡,所有的数据都还存在内存里,页面是无重载的。

F5刷新做了什么事呢,重新载入页面,销毁之前所有的数据。

所以,F5页面刷新,页面销毁之前的资源,重新请求,因此写在生命周期里的vuex数据是重新初始化,无法获取的。

在App.vue中使用

在store下的index.js中

存储到sessionStorage(cookie与localStore一样):

vuex-persistedstate默认持久化所有state,指定需要持久化的state,配置如下:

plugins后面加数组可以配置多个

四、Vuex***刷新页面后数据就消失了***怎么保存数据持久化

1.如果想让某些数据页面刷新之后不消失,那就可以结合本地存储做到数据持久化

2.比如之前的搜索记录,还有一些需要依赖的数据。比如本次活动的代号存下来,让我在一段时间内,根据这个编号来确定相关代号代表的一批数据可以缓存在本地,一遍在下一次请求的时候快速返回

3.实现原理:在mutations定义的方法里对vuex的状态*作的同时对存储也做相应的*作

4.插件vue-savedata,vuex-persistedstate

5.实际实现:监听浏览器的刷新,刷新之前把vuex存在本地,在路由拦截处获取本地储存,放进vuex并删除本地存储,可以自由控制存localstorage和sessionStorage,完全避免插件来消耗性能。

6.不同页面之间的数据传值,vuex适合组件间传值。

7.有的问题研究一分钟和一个小时,是会发现不同的问题。

1.vuex存储在内存。localstorage则以文件的方式存储在本地

2.应用场景:vuex用于组件之间的传值,localstorage则用于不同页面之间的传值

3.永久性:当刷新页面时vuex存储的值会丢失。localStorage不会删除

4.localstorage:只能进行简单的数据读写,对不同组件之间读取数据并做数据转化时,需要对每个读写*作都写一遍代码,重点是存放

5.vuex是状态管理,重点是管理数据,一个是数据容器,一个是数据管理器。

下列选项(默认保存store中的每个数据到本地)

可以为您的特定需求配置插件:(参数都是可选的:有默认值)

1.store/index.js

相关文章

SHARP【新品】夏普55英寸M55Q5CA怎么样?质量测评好不好用?

SHARP【新品】夏普55英寸M55Q5CA怎么样?质量测评好不好用?

很多小伙伴在关注SHARP【新品】夏普55英寸M55Q5CA怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,...

Vidda海信电视口碑好不好

Vidda海信电视口碑好不好

很多小伙伴在关注Vidda海信电视怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

LG55英寸C2质量怎么样

LG55英寸C2质量怎么样

很多小伙伴在关注LG55英寸C2怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

亚美嘉擦镜纸测评分享

亚美嘉擦镜纸测评分享

很多小伙伴在关注亚美嘉擦镜纸怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

360摄像头7P测评分享

360摄像头7P测评分享

很多小伙伴在关注360摄像头7P怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

AppleWatch测评怎么样

AppleWatch测评怎么样

很多小伙伴在关注AppleWatch怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...