在循环中更新对象值,使用 Vue 在所有项目上获得相同的值

Posted

技术标签:

【中文标题】在循环中更新对象值,使用 Vue 在所有项目上获得相同的值【英文标题】:Update object value in a loop getting the same value on all items using Vue 【发布时间】:2020-11-19 22:37:16 【问题描述】:

我正在一个循环中运行,它应该更新 vue 环境中对象内的一些值。

我尝试了 map、foreach 和 for 循环,但特定属性(例如 Id 或 show)总是得到相同的值。

我对 jsfiddle 采取了相同的逻辑(我将部分相同的数据放在那里进行播放)并且它在那里工作。

代码如下:

var data = t.data.map((item) => 
        item.Status = Status.Draft;
          if (item.IsSent) 
            item.Status = Status.Sent;
          
          return item;
        );

data.forEach((item) => 
     item.Buttons.forEach((b, index) => 
          const id =  Id: "button_" + item.ID + "_" + index ;
          let show =  show: false ;
          switch (b.action) 
              case ButtonActions.Duplicate:
              case ButtonActions.Delete:
              case ButtonActions.Preview: 
                show =  show: true ;
                break;
              
              case ButtonActions.Reports:
              case ButtonActions.Groups: 
                if (item.IsSent) 
                  show =  show: true ;
                 else 
                  show =  show: false ;
                
                break;
              
              case ButtonActions.Send:
              case ButtonActions.Schedule:
              case ButtonActions.Edit: 
                if (item.IsSent) 
                  show =  show: false ;
                 else 
                  show =  show: true ;
                
                break;
              
            
            Object.assign(b, id);
            Object.assign(b, show);
     );
    //console.log(item.Buttons);
); 

button.id 总是为所有按钮相同 id。 button.show 可以是真或假,但无论我使用什么循环,所有按钮总是相同, 控制台显示预期值, 然后在循环之后,奇怪的是,添加了属性但所有的值都相同。

看起来我发现了一个 Vue 错误! :(

有人可以帮忙吗?

【问题讨论】:

请发布您的数据属性,以便获得更多信息。 ButtonActions 对象来自哪里?那是 Typescript 界面吗? 您好,感谢您的回复,您可以在 jsfiddle 中看到它,作为数字。 我实际上指的是 Vue 中的 data 属性。那是data() return: data 【参考方案1】:

在 vue documentation 关于对象的反应性警告中,

它说:

有时您可能希望将多个属性分配给现有对象,例如使用 Object.assign() 或 _.extend()。但是,添加到对象的新属性不会触发更改。在这种情况下,使用原始对象和 mixin 对象的属性创建一个新对象:

// instead of `Object.assign(this.someObject,  a: 1, b: 2 )`
this.someObject = Object.assign(, this.someObject,  a: 1, b: 2 )

因此,在这种情况下,这应该会有所帮助

b = Object.assign(, b,  id, show )

或者,您可以使用

this.$set(b, 'show', show);
this.$set(b, 'id', id);

【讨论】:

是的,我尝试了这两种解决方案,但都不起作用。我在 GitHub 中打开了一个问题。我尝试了所有我知道的现有选项,循环,对象分配,设置,一切。毕竟我在这里。 这很奇怪。我会再调查一下。同时,你认为你可以创建一个 Vue 版本的 jsfiddle 吗?目前正在使用的是香草 JS。 对不起,我不明白,首先,感谢您的帮助,其次,这里的代码是在Vue中,jsFiddle是在使用Vue库的js vanila中。当您说创建 vue 版本的 jsfiddle 时,您到底是什么意思?顺便说一句,我同意,这很奇怪。我打开了一个问题,就像我说的那样。 我不认为代码在 Vue.js 中。这是一个用 Vue.js 编写的 fiddle 示例。注意FRAMEWORKS AND EXTENSION 下的No-library (PURE JS) 是如何被选中的?将其与我链接的示例进行比较。此外,您需要初始化一个 vue 实例。 new Vue(...... 我去查看了其他几个 vue jsfiddle 示例,虽然它们并不总是指定 FRAMEWORKS AND EXTENSION,但它们总是有一个新的 Vue 实例。我的错。 Example 1、Example 2 和 Example 3 做同样的事情。

以上是关于在循环中更新对象值,使用 Vue 在所有项目上获得相同的值的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js - 从方法计算的值不会显示在循环列表中

vue中 数组通过循环添加新属性页面不更新

vue中修改对象数组的属性值不会渲染到页面上

Vue方向:Vue实例上使用$set()更新对象或数组

如何更新 vue-router

vue中的$nextTick()