基于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事件冒泡实例分享(已测试)
Apr 23 Javascript
javascript:;与javascript:void(0)使用介绍
Jun 05 Javascript
js判断为空Null与字符串为空简写方法
Feb 24 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
Jan 23 Javascript
javascript验证香港身份证的格式或真实性
Feb 07 Javascript
JS验证input输入框(字母,数字,符号,中文)
Mar 23 Javascript
详解如何使用 vue-cli 开发多页应用
Dec 16 Javascript
JS实现判断有效的数独算法示例
Feb 25 Javascript
从理论角度讨论JavaScript闭包
Apr 03 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
Apr 11 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 Javascript
JS实现躲避粒子小游戏
Jun 18 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
初次接触php抽象工厂模式(Elgg)
2010/03/21 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
Python assert关键字原理及实例解析
2019/12/13 Python
keras中的History对象用法
2020/06/19 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
python利用opencv实现颜色检测
2021/02/23 Python
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
美国时尚在线:Showpo
2017/09/08 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
授权委托书样本
2014/04/03 职场文书
租房协议书
2014/04/10 职场文书
拔河比赛口号
2014/06/10 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
办公用品管理制度
2015/08/04 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python