我正在努力在VueJs中创建类似网格的组件。你可以在这里看到JSFiddle:https://jsfiddle.net/masade/nrb9f4j2/
<datacell>
组件用于允许对任何单元格进行内联编辑。rows
的更改并将其保存在本地存储中this.$parent.unshift(newrow)
组件中<addrow>
正在将新创建的行推送到父对象问题是当我添加一个新行时,虽然它被添加到行本地存储中但是没有被监视更改
复制问题的步骤(在JS小提琴上):
如果我做错了,请帮助我理解
答案 0 :(得分:3)
你偶然发现了Vue中的一个change detection caveats。使用该对象的索引向对象添加属性时,Vue无法检测到。
您可以像这样定义newrow
:
data: function(){
return {
newrow : {}
}
},
表示newrow
没有属性。之后,您始终使用索引向newrow
添加属性,如下所示:
this.$parent.cols.map(function(col,index){
if(typeof newrow[col.m] == "undefined")
newrow[col.m] = "";
})
这意味着Vue不知道您刚刚添加的任何属性。
我在您的小提琴中添加了一个名为makeNewRow
的方法,它使用newrow
方法正确地添加了$set
所需的属性。
makeNewRow(){
this.newrow = {};
this.$parent.cols.map((col,index) => this.$set(this.newrow, col.m, null))
},
然后我在mounted
和您的addRow
方法中调用它。这可以解决您的错误。这是更新的fiddle。
注意:我修复了代码中的其他错误。如果有人打开了您的应用,并且以前 在其本地存储中没有grid-vue-local
,则uid
的{{1}}将为零,并且他们添加的第一行会有id 0.为了解决这个问题,我只需添加
gridStorage
答案 1 :(得分:1)
data(){
return{
items:localStorage.fetch()
}
}
watch:{
items:{
handler:function(items){
localStorage.save(items);
},
deep:true
}
}
您可以保存项目,并观看项目,如果项目已更改,则会更新