详解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 相关文章推荐
Google韩国首页图标动画效果
Aug 26 Javascript
jquery 提交值不为空的元素示例代码
May 10 Javascript
JS正则表达式获取分组内容的方法详解
Nov 15 Javascript
js动态添加表格数据使用insertRow和insertCell实现
May 22 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
动态加载js文件简单示例
Apr 21 Javascript
Vue官方文档梳理之全局配置
Nov 22 Javascript
React Native自定义控件底部抽屉菜单的示例
Feb 08 Javascript
200行HTML+JavaScript实现年会抽奖程序
Jan 22 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
Apr 28 Javascript
使用 UniApp 实现小程序的微信登录功能
Jun 09 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
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
js定时器实例分享
2016/12/20 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
vue删除html内容的标签样式实例
2018/09/13 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
Python线程指南分享
2019/11/19 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
计算机应用专业推荐信
2013/11/13 职场文书
2015年教师节主持词
2015/07/03 职场文书
计算机教师工作总结
2015/08/13 职场文书
Python中with上下文管理协议的作用及用法
2022/03/18 Python