基于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 Archive Network 集合
May 12 Javascript
微博@符号的用户名提示效果。(想@到谁?)
Nov 05 Javascript
jQuery学习笔记之创建DOM元素
Jan 19 Javascript
AngularJS中的表单简单入门
Jul 28 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
Sep 17 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
Mar 14 Javascript
Three.js基础学习教程
Nov 16 Javascript
vue项目中使用ueditor的实例讲解
Mar 05 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
Sep 05 Javascript
代码实例ajax实现点击加载更多数据图片
Oct 12 Javascript
vue+elementUi图片上传组件使用详解
Aug 20 Javascript
js实现多个标题吸顶效果
Jan 08 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目录拷贝实现方法
2015/07/10 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
JS 控制CSS样式表
2009/08/20 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
详解Eslint 配置及规则说明
2018/09/10 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
Python Queue模块详解
2014/11/30 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
详解Python循环作用域与闭包
2019/03/21 Python
python logging 日志的级别调整方式
2020/02/21 Python
党员个人对照检查材料
2014/10/01 职场文书
瘦西湖导游词
2015/02/03 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书