基于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跨页面保存变量做菜单的方法
Jan 17 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
JS实现的生成随机数的4个函数分享
Feb 11 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
Jun 06 Javascript
js+css简单实现网页换肤效果
Dec 29 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
AngularJs ng-route路由详解及实例代码
Sep 14 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
Nov 03 Javascript
基于jQuery实现咖啡订单管理简单应用
Feb 10 Javascript
vue.js+element-ui动态配置菜单的实例
Sep 07 Javascript
小程序绑定用户方案优化小结
May 15 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
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 实用代码收集
2010/01/22 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
js读取本地excel文档数据的代码
2010/11/11 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
js获取Get值的方法
2016/09/29 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
浅谈python可视化包Bokeh
2018/02/07 Python
numpy中的高维数组转置实例
2018/04/17 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
服务中心夜班服务员岗位职责
2013/11/27 职场文书
小区门卫工作职责
2013/12/14 职场文书
库房保管员岗位职责
2014/04/07 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
土建工程师岗位职责
2014/06/10 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
春秋淹城导游词
2015/02/11 职场文书
中学政教处工作总结
2015/08/13 职场文书
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS