vue.js是经过数据劫持的方式实现数据的双向绑定的,其中过程以下:html
当把一个JavaScript对象传给Vue实例的data选项时,Vue会遍历此对象的全部属性并使用 Object.defineProperty(),把这些属性所有转化为 getter/setter 。每一个组件实例都有相应的 watcher 实例对象,它会在组件渲染的时候把属性记录为依赖,以后当依赖的setter被调用时,会通知watcher从新计算,从而导致它关联的组件得以更新。所以,每当数据变化的时候会引发视图的变化,更新view。vue
由于Vue在初始化实例时会对属性进行 getter/setter 转化,这样,被转化的属性就是 响应式的,而只有在data中声明的属性会执行这个过程。因此,后续经过JavaScript传过来的对象属性由于没有在 data 中声明,因此并不会执行这个转化过程,所以这些属性全都是 不响应式的。数组
也是由于这个缘由,如今的 Vue.js 没法监听到对象属性的添加和删除,也没法检测到数组的变更。spa
我我的在解决这个报错问题的时候是经过将报错的属性名在 data 中先进行初始化声明,后续给对象赋值的时候再进行覆盖的方式。可是这种方式治标不治本。我的建议仍是使用全局的方式进行声明。双向绑定
推荐如下博文,讲解很是的详细。http://www.javashuo.com/article/p-wwixdnaf-p.htmlhtm