基于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 string 扩展库代码
Apr 09 Javascript
多个js与css文件的合并方法详细说明
Dec 26 Javascript
让复选框只能选择一项的方法
Oct 08 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
Nov 25 Javascript
浅析JavaScript中两种类型的全局对象/函数
Dec 05 Javascript
javascript创建和存储cookie示例
Jan 07 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
Feb 15 Javascript
剖析Node.js异步编程中的回调与代码设计模式
Feb 16 Javascript
js实现StringBuffer的简单实例
Sep 02 Javascript
angularjs中ng-bind-html的用法总结
May 23 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 Javascript
vue elementUI使用tabs与导航栏联动
Jun 21 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
帅气的琦玉老师
2020/03/02 日漫
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
php rsa加密解密使用详解
2015/01/14 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
浅谈Node.js:Buffer模块
2016/12/05 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
Python常用的爬虫技巧总结
2016/03/28 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
Python:slice与indices的用法
2019/11/25 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
历史专业个人求职信范文
2013/12/07 职场文书
公司培训心得体会
2014/01/03 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
初二学生评语大全
2014/12/26 职场文书
甲午大海战观后感
2015/06/02 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
解决Go gorm踩过的坑
2021/04/30 Golang
解决 redis 无法远程连接
2022/05/15 Redis