个人的奋斗还是历史的进程?
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()