详解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 相关文章推荐
In Javascript Class, how to call the prototype method.(three method)
Jan 09 Javascript
JavaScript CSS修改学习第五章 给“上传”添加样式
Feb 19 Javascript
判断是否安装flash player及当前版本的JS代码
Aug 08 Javascript
javascript框架设计之种子模块
Jun 23 Javascript
瀑布流的实现方式(原生js+jquery+css3)
Jun 28 Javascript
获取jqGrid中选择的行的数据
Nov 30 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
Jan 18 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
Jul 10 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
May 17 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 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
必须收藏的23个php实用代码片段
2016/02/02 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
基于hover的用法实例(推荐)
2017/07/04 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
js 函数性能比较方法
2020/08/24 Javascript
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
Python面向对象类的继承实例详解
2018/06/27 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
python 写一个文件分发小程序
2020/12/05 Python
python openpyxl模块的使用详解
2021/02/25 Python
深入探究HTML5的History API
2015/07/09 HTML / CSS
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
竞聘上岗演讲
2014/05/19 职场文书
护理专科学生自荐书
2014/07/05 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
2015大学生实训报告
2014/11/05 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
学校食堂管理制度
2015/08/04 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers