详解vuex结合localstorage动态监听storage的变化


Posted in Javascript onMay 03, 2018

需求:不同组件间共用同一数据,当一个组件将数据发生变化时,其他组件也可以响应该变化。

分析:vue无法监听localstorage的变化。localstorage主要用于不同页面间传值,vue适合组件间传值。对于组件间共用同一数据又想保存住信息或者再页面刷新的时候不丢失数据(vuex在页面刷新的时候存储的值会丢失,localstorage存储在本地浏览器中),可以采用vuex+localstorage的方式。

关于vuex和storage的区别

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

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

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

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

关于vuex参考文档:http://vuex.vuejs.org/zh-cn/index.html

实现过程:以首页展示用户头像信息,修改个人信息在公共组件头部组件中为例,当用户修改个人信息时首页的图片实时变化,如果不对头像信息做存储更新,每次用户修改完只有刷新页面或者从其他页面返回回来才能看到变化,即新设置的头像信息,仅展示核心代码。

1.首先先定义一个变量在state中。State负责存储整个应用的状态数据,后期就可以使用this.$store.state直接获取状态。也可以利用vuex提供的mapState辅助函数将state映射到计算属性中去。

const state = {
 imgInfo:null //首页头像信息

}

2.mutations里面存储localstorage的信息。Mutations可以更改状态,本质就是用来处理数据的函数,其接收唯一参数值state。定义的mutation必须是同步函数。this.$store.commit(mutationName)是用来触发一个mutation的方法,或者使用辅助函数mapMutations直接将触发函数映射到methods上,这样就能在元素事件绑定上直接使用了。

export const SETIMGINFO = 'SETIMGINFO'
[SETIMGINFO] (state,info) {
 state.imgInfo=info
 localStorage.setItem('imgInfo',info)
 }

3.getter里面获取localstorage的信息。有些状态需要做二次处理,就可以使用getters。通过this.$store.getters.valueName对派生出来的状态进行访问。或者直接使用辅助函数mapGetters将其映射到本地计算属性中去。

getImgInfo(state){
  if(localStorage.getItem('imgInfo')){
  state.imgInfo=localStorage.getItem('imgInfo')
  }
  return state.imgInfo
 }

4.在需要对storage进行操作的页面引用mapMutations函数

import {mapMutations} from 'vuex' //引入mapMutations
 ...mapMutations([      
  'SETIMGINFO'
  ]),
this.SETIMGINFO(this.imgInfo) 
 //在需要的地方引用 mutations里面定义的方法

5.在需要获取storage信息的页面引用mapGetters辅助函数

import {mapGetters} from 'vuex'
computed:{
  ...mapGetters([   
  'getImgInfo'
  ])
 },
watch:{ //动态监听state的变化,实时改变页面的数据
  getImgInfo: function(li) { //li就是改变后的state里面的imgInfo
  let vm = this;
   this.imgInfo=li //data声明一个变量,在html引用。如果storage的值发生变化就实时刷新变量的值。
  }
 },

6.模板中对vuex的值的引用

<img :src="imgInfo?imgInfo:info.avatar"> 
//三元不等式,如果state发生变化有值就赋值给img标签,如果没有即刚进页面就赋值给create生命周期函数中从接口读出来的数据

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery中add实现同时选择两个id对象
Oct 22 Javascript
IE下写xml文件的两种方式(fso/saveAs)
Aug 05 Javascript
JS中判断null、undefined与NaN的方法
Mar 24 Javascript
利用纯Vue.js构建Bootstrap组件
Nov 03 Javascript
js实现打地鼠小游戏
Feb 13 Javascript
基于JavaScript实现验证码功能
Apr 01 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
Jun 20 Javascript
微信小程序 本地图片按照屏幕尺寸处理
Aug 04 Javascript
vue源码入口文件分析(推荐)
Jan 30 Javascript
el-select数据过多懒加载的解决(loadmore)
May 29 Javascript
vue 中 命名视图的用法实例详解
Aug 14 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
Nov 01 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 #Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 #Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 #Javascript
Angular学习教程之RouterLink花式跳转
May 03 #Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
May 03 #Javascript
Vue表单类的父子组件数据传递示例
May 03 #Javascript
Webpack path与publicPath的区别详解
May 03 #Javascript
You might like
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
2014/10/30 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
Move.js入门
2017/02/08 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python 判断自定义对象类型
2009/03/21 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
python matplotlib库的基本使用
2020/09/23 Python
介绍一下gcc特性
2012/01/20 面试题
上班离岗检讨书
2014/01/27 职场文书
给学校的建议书范文
2014/05/15 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
先进党组织事迹材料
2014/12/26 职场文书
药品开票员岗位职责
2015/04/15 职场文书