如何在 VueJs 的本地存储中“观察”新创建的行?

Posted

技术标签:

【中文标题】如何在 VueJs 的本地存储中“观察”新创建的行?【英文标题】:How to 'watch' newly created rows in local storage in VueJs? 【发布时间】:2017-10-12 11:22:12 【问题描述】:

我正在努力在 VueJs 中创建一个类似网格的组件。您可以在此处查看 JSFiddle:https://jsfiddle.net/masade/nrb9f4j2/

在上面的小提琴中,<datacell> 组件用于允许对任何单元格进行内联编辑。 我正在“观察”对 rows 的更改并将它们保存在本地存储中 this.$parent.unshift(newrow)<addrow> 组件中将新创建的行推送到父对象

问题是当我添加一个新行时,虽然它被添加到行本地存储中,但它并没有被监视更改

复制问题的步骤(在 JS fiddle 上):

点击添加行并输​​入要添加的名称 添加行后,单击第二列(年份)并更新它 对新添加行的任何更改都不会更新 但是,如果您刷新页面并再次修改,我可以再次更新它。

如果我做错了什么,请帮助我理解

【问题讨论】:

【参考方案1】:

您偶然发现了 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 的方法,该方法使用$set 方法正确地将您需要的属性添加到newrow

makeNewRow()
    this.newrow = ;
    this.$parent.cols.map((col,index) => this.$set(this.newrow, col.m, null))
,

然后我在mounted 和你的addRow 方法中调用它。这修复了您的错误。这是更新后的fiddle。

注意:我修复了您的代码中的另一个错误。如果有人打开您的应用程序并且以前在他们的本地存储中没有grid-vue-local,那么gridStorageuid 将为零,并且他们添加的第一行将具有 id 0。为了解决这个问题,我简单地添加了

save: function (rows) 
  gridStorage.uid = rows.length
  localStorage.setItem(STORAGE_KEY, JSON.stringify(rows))

【讨论】:

非常感谢,这两天一直在努力理解这一点:)【参考方案2】:
data()
   return
     items:localStorage.fetch()
   



watch:
   items:
     handler:function(items)
        localStorage.save(items);
     ,
     deep:true
   

您可以保存在项目中,并观看项目,如果项目发生了变化,它会更新

【讨论】:

我也在做同样的事情,它将组件应用于新创建的行。 js 中的第 74 行 - jsfiddle.net/masade/nrb9f4j2

以上是关于如何在 VueJs 的本地存储中“观察”新创建的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VueJS 3.0 中使用 defineComponent 注册本地组件

如何在Vue中导入本地存储的xml文件并进行编辑?

如何在 VueJS 中更新表的数据?

如何创建一个变量并将其存储为 50 个观察值(python)?

使用 angularjs 观察本地存储

如何使用 CLI 从我现有的本地 git 存储库创建新的 gitlab 存储库?