基于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 无提示关闭窗口脚本
Aug 17 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
Oct 28 Javascript
js判断60秒以及倒计时示例代码
Jan 24 Javascript
JS实现向表格中动态添加行的方法
Mar 30 Javascript
jQuery绑定事件的四种方式介绍
Oct 31 Javascript
AngularJS学习第一篇 AngularJS基础知识
Feb 13 Javascript
基于JavaScript实现多级菜单效果
Jul 25 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
Jan 18 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 Javascript
JS如何监听div的resize事件详解
Dec 03 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开发微信支付的代码分享
2014/05/25 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
在Python中使用HTML模版的教程
2015/04/29 Python
对Python 语音识别框架详解
2018/12/24 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
zooplus波兰:在线宠物店
2019/07/21 全球购物
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
学术会议邀请函范文
2014/01/22 职场文书
车间机修工岗位职责
2014/02/28 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
文明城市创建标语
2014/06/16 职场文书
公共场所标语
2014/06/30 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
学期个人工作总结
2015/02/13 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP