基于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/JQuery显示或隐藏文本的方法
Feb 13 Javascript
JS+CSS实现的拖动分页效果实例
May 11 Javascript
javascript作用域问题实例分析
Jul 13 Javascript
12种JavaScript常用的MVC框架比较分析
Nov 16 Javascript
JS遍历页面所有对象属性及实现方法
Aug 01 Javascript
jQuery+Ajax实现用户名重名实时检测
Jun 01 jQuery
微信小程序的分类页面制作
Jun 27 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
May 28 Javascript
基于vue中keep-alive缓存问题的解决方法
Sep 21 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 Javascript
js实现蒙版效果
Jan 11 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
Jul 23 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
详细分析单线程JS执行问题
2017/11/22 Javascript
vue小白入门教程
2018/04/02 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
Python中使用asyncio 封装文件读写
2016/09/11 Python
python的exec、eval使用分析
2017/12/11 Python
python3处理含有中文的url方法
2018/05/10 Python
Python模块的加载讲解
2019/01/15 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
pytorch 预训练层的使用方法
2019/08/20 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
python列表的逆序遍历实现
2020/04/20 Python
Python如何输出整数
2020/06/07 Python
Python类及获取对象属性方法解析
2020/06/15 Python
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers