详解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 相关文章推荐
JavaScript中判断页面关闭、页面刷新的实现代码
Aug 27 Javascript
AngularJS的一些基本样式初窥
Jul 27 Javascript
基于JavaScript实现定时跳转到指定页面
Jan 01 Javascript
JavaScript 栈的详解及实例代码
Jan 22 Javascript
AngularJS的$location使用方法详解
Oct 19 Javascript
Vue-Router实现组件间跳转的三种方法
Nov 07 Javascript
Vue 中批量下载文件并打包的示例代码
Nov 20 Javascript
webpack打包js文件及部署的实现方法
Dec 18 Javascript
Vue实现的父组件向子组件传值功能示例
Jan 19 Javascript
layui多iframe页面控制定时器运行的方法
Sep 05 Javascript
Javascript执行流程细节原理解析
May 14 Javascript
VUE+Element实现增删改查的示例源码
Nov 23 Vue.js
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自定义urlencode,urldecode函数实例
2015/03/24 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
浅谈Python单向链表的实现
2015/12/24 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
python模拟表单提交登录图书馆
2018/04/27 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
心理健康教育制度
2014/01/27 职场文书
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
投标承诺书范本
2014/03/27 职场文书
社区先进事迹材料
2014/05/19 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
博士导师推荐信
2015/03/25 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
python 统计代码耗时的几种方法分享
2021/04/02 Python
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB