基于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 相关文章推荐
JavaScript中的正则表达式简明总结
Apr 04 Javascript
js交换排序 冒泡排序算法(Javascript版)
Oct 04 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
Sep 14 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
Sep 19 Javascript
详解基于javascript实现的苹果系统底部菜单
Dec 02 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
微信小程序实现的一键拨号功能示例
Apr 24 Javascript
vue.js实现回到顶部动画效果
Jul 31 Javascript
JS中封装axios来管控api的2种方式
Sep 11 Javascript
解决Vue @submit 提交后不刷新页面问题
Jul 18 Javascript
8个JS的reduce使用实例和reduce操作方式
Oct 05 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 99乘法表的几种实现代码
2020/10/13 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
ext form 表单提交数据的方法小结
2008/08/08 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
js获取class的所有元素
2013/03/28 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
原生js轮播特效
2017/05/18 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
PyQt5每天必学之布局管理
2018/04/19 Python
python实现字符串加密成纯数字
2019/03/19 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
Europcar比利时:租车
2019/08/26 全球购物
管道维修工岗位职责
2013/12/27 职场文书
学生打架检讨书大全
2014/01/23 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
餐饮投资计划书
2014/04/25 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
工作自我推荐信范文
2015/03/25 职场文书
党支部对转正的意见
2015/06/02 职场文书
初三化学教学反思
2016/02/22 职场文书
canvas多重阴影发光效果实现
2021/04/20 Javascript
Java 数组内置函数toArray详解
2021/06/28 Java/Android