详解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 相关文章推荐
ie 调试javascript的工具
Apr 29 Javascript
JavaScript DOM学习第四章 getElementByTagNames
Feb 19 Javascript
javascript四舍五入函数代码分享(保留后几位)
Dec 10 Javascript
js调试工具console.log()方法查看js代码的执行情况
Aug 08 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
Oct 17 Javascript
Web开发必知Javascript技巧大全
Feb 23 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
Apr 27 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
基于 jQuery 实现键盘事件监听控件
Apr 04 jQuery
JS实现查找数组中对象的属性值是否存在示例
May 24 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
JS async 函数的含义和用法实例总结
Apr 08 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面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
DIV始终居中的js代码
2014/02/17 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
JavaScript极简入门教程(一):基础篇
2014/10/25 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
js性能优化技巧
2015/11/29 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
Angular.js中angular-ui-router的简单实践
2017/07/18 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
2020/03/26 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
跟老齐学Python之再深点,更懂list
2014/09/20 Python
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
python交互式图形编程实例(一)
2017/11/17 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
浅析python中while循环和for循环
2019/11/19 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
会计专业的自荐信
2013/12/12 职场文书
《雨点》教学反思
2014/02/12 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
销售总经理岗位职责
2014/03/15 职场文书
篮球赛新闻稿
2015/07/17 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python