基于Vuex无法观察到值变化的解决方法


Posted in Javascript onMarch 01, 2018

在跨越主路由视图时,由于Vuex的状态值一直存储在内存中,所以在组件视图重新载入时,可能会出现组件无法检测到状态值的变化,从而导致业务逻辑出现错误。

假定通用头部组件有一个全局任务状态值,其他的组件都要根据此任务值进行更新,更可能出现的情况是,任务状态值是异步加载完成的,于是需要如此编写业务逻辑:

computed : {
 task () {
  return this.$store.state.task
 } 
},
watch : {
 task : {
   deep: true,
   handler (val) {
    // 由于是异步载入,所以只能在状态值的变化时执行渲染操作
    // 绝不可在mounted中执行render方法
    this.render(val)
   }
 } 
}

但是,由于上面的原因,第一次载入视图时,因为Vuex的状态值还没有存储在内存中,所以渲染正常。发生了视图切换后,虽然也重新载入了任务状态值,但由于task并没有发生变化,所以render方法不会被调用,于是组件无法完成渲染过程。

解决的办法很简单,强行触发task值发生改变,方法是定义一个时间戳,如果觉得在时间戳的粒度仍然太粗,还可以组合使用随机数,如下:

watch: {
 taskId : {
   handler (val) {
    // 从v-model获取到的新值
    let taskId = this.taskId
    // 提交新值变化
    this.$store.commit(TASK_ID, 
    {
     id : taskId,
     // 添加时间戳
     time : Date.now().valueOf(),
     // 添加随机数
     random : Math.random()
    })
   }
 }
}

经过上面的处理,只要发生taskId的赋值现象,那么一定会触发Vuex的状态变化,所以每次组件载入时或taskId的值发生变化时,render方法就一定会被执行。

结论

为了满足Vuex的值传递要求,尤其是需要强行刷新Vuex的缓存时,添加时间戳与随机数不失为一种好的解决方案。

以上这篇基于Vuex无法观察到值变化的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一段非常简单的让图片自动切换js代码
Nov 10 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
Oct 11 Javascript
js获取某月的最后一天日期的简单实例
Jun 22 Javascript
值得分享的Bootstrap Table使用教程
Nov 23 Javascript
微信小程序 特效菜单抽屉效果实例代码
Jan 11 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
Feb 15 Javascript
基于javaScript的this指向总结
Jul 22 Javascript
vue.js实现只弹一次弹框
Jan 29 Javascript
详解.vue文件解析的实现
Jun 11 Javascript
vue实现随机验证码功能的实例代码
Apr 30 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
JavaScript实现鼠标经过表格某行时此行变色
Nov 20 Javascript
Node.js readline模块与util模块的使用
Mar 01 #Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
Mar 01 #Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 #Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
Mar 01 #Javascript
详解用Node.js写一个简单的命令行工具
Mar 01 #Javascript
vue-prop父组件向子组件进行传值的方法
Mar 01 #Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
Mar 01 #Javascript
You might like
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
回顾Javascript React基础
2019/06/15 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python导入txt数据到mysql的方法
2015/04/08 Python
python简单实现计算过期时间的方法
2015/06/09 Python
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python使用生成器实现可迭代对象
2018/03/20 Python
python读写csv文件方法详细总结
2019/07/05 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
学习党课思想汇报
2013/12/29 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
房产委托公证书样本
2014/04/04 职场文书
研究生求职自荐书
2014/06/23 职场文书
股东合作协议书
2014/09/12 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2015年父亲节寄语
2015/03/23 职场文书
个人廉政承诺书
2015/04/28 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
送给客户微信问候语!
2019/07/04 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
7个你应该知道的JS原生错误类型
2021/04/29 Javascript
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫