基于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 相关文章推荐
jQuery1.6 类型判断实现代码
Sep 01 Javascript
A标签中通过href和onclick传递的this对象实现思路
Apr 19 Javascript
自定义的一个简单时尚js下拉选择框
Nov 20 Javascript
AngularJS中的模块详解
Jan 29 Javascript
JavaScript实现的字符串replaceAll函数代码分享
Apr 02 Javascript
jQuery on()方法示例及jquery on()方法的优点
Aug 27 Javascript
Javascript将JSON日期格式化
Aug 23 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 Javascript
Vue Echarts实现可视化世界地图代码实例
May 07 Javascript
Vue基础配置讲解
Nov 29 Javascript
jquery实现垂直手风琴菜单
Mar 04 jQuery
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+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
php多进程应用场景实例详解
2019/07/22 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
Python列表切片操作实例总结
2019/02/19 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
销售顾问的岗位职责
2013/11/13 职场文书
服装设计专业自荐书范文
2013/12/30 职场文书
节约能源标语
2014/06/17 职场文书
治安消防安全责任书
2014/07/23 职场文书
年会主持人开场白台词
2015/05/29 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS