Zonebit

个人的奋斗还是历史的进程?

View the Project on GitHub

20 July 2018

vue绑定的样式对象修改后view视图不更新的问题

by ganlyun

记录一个vue开发中出现的问题

组件中使用 :style=”calcSiderStyle” 绑定了一个样式对象,这个对象是一个计算属性,返回 Object.assign() 合成的对象,方法的第一个参数是一个prop,第二个参数是计算得来的一个样式对象,但是修改了第二个参数中的部分参数值后,view并没有刷新,通过vue-devtools可以看到calcSiderStyle计算属性确实更新了,但是view没有响应变化

初步考虑是因为vue没有深入探测对象属性值的变化,隐约记得这个跟JavaScript本身有关系,JavaScript对象属性的变化并不意味着对象变化

研究样式绑定部分文档,发现,style可以利用数组绑定多个对象,对象合并的工作框架会自己完成的,遂修改如下

:style = “[siderStyle, calcSiderStyle]”

在calcSiderStyle计算属性中只返回第二个参数对象,不使用Object.assign()进行合并,运行后成功刷新

继续翻文档

教程 》》》深入响应式原理 》》》检测变化的注意事项 中说:

受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除

可是没有直接说明能不能检测到对象属性值的改变,按理来说应该是一样不行,继续往下:

有时你想向已有对象上添加一些属性,例如使用 Object.assign()_.extend() 方法来添加属性。但是,添加到对象上的新属性不会触发更新。在这种情况下可以创建一个新的对象,让它包含原对象的属性和新的属性

好了,终于找到了我们需要的信息,这里的解释稍微有点不一样,说是“添加到对象上的新属性不会触发更新”,但肯定就是我们遇到的问题了

tags: vue - style - computed - Object.assign()