Vue更改数组中的对象并触发反应

新手上路,请多包涵

更改数组中索引找到的对象的一部分时如何触发更新?

文档展示了如何更改数组的值:

 Vue.set(example1.items, indexOfItem, newValue)

或者

example1.items.splice(indexOfItem, 1, newValue)

但是如何在不改变对象其余部分的情况下改变数组中对象的属性值呢?

以下内容用于更新属性,但 Vue 不会对更改做出反应,直到有其他东西触发更新。

 example1.items[indexOfItem].some_object_property = false

原文由 shanemgrey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 608
2 个回答

只要你调用一次 set() 来设置数组中的对象(带有你要更新的属性),Vue 就会对对象属性的变化做出反应。这是一个示例,其中一个对象数组在我们的应用程序数据中初始化,另一个对象数组在挂载时手动设置(使用 Vue.set())。单击按钮会更新每个数组中一个对象的属性,Vue 会做出反应。请注意,在 mount() 中发生的 set() 调用实际上可能随时发生。

https://codepen.io/jordan-kalosal/pen/VrwjoR

 new Vue({
  el: "#app",
  data: {
    arr: [
      {
        property: 'OBJ1 Prop'
      },
      {
        property: 'OBJ2 Prop'
      }
    ],
    setLater: false
  },
  mounted() {
    this.$set(this, 'setLater', [
      {
        property: 'setLater OBJ1 Prop'
      },
      {
        property: 'setLater OBJ2 Prop'
      }
    ])
  },
  methods: {
    _updateObjProps() {
      this.arr[0].property = (new Date()).toString();
      this.setLater[0].property = (new Date()).toString();
    }
  }
})

原文由 Jordan Haines 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 this.$set() 更新数组元素中的子属性。例如,要在前两个数组元素中增加 x 子属性(如果子属性不存在,则创建子属性):

 methods: {
  update() {
    this.$set(this.arr[0].foo, 'x', (this.arr[0].foo.x || 0) + 100)
    this.$set(this.arr[1].foo, 'x', (this.arr[1].foo.x || 0) + 100)
  }
}

 new Vue({
  el: '#app',
  data() {
    return {
      arr: [
        {
          foo: {
            x: 100,
            y: 200
          }
        },
        {
          foo: {
            /* x does not exist here initially */
            y: 400
          }
        }
      ]
    };
  },

  methods: {
    update() {
      this.$set(this.arr[0].foo, 'x', (this.arr[0].foo.x || 0) + 100)
      this.$set(this.arr[1].foo, 'x', (this.arr[1].foo.x || 0) + 100)
    }
  }
})
 <script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>

<div id="app">
  <button @click="update">Update</button>
  <p>arr[0]: {{ arr[0] }}</p>
  <p>arr[1]: {{ arr[1] }}</p>
</div>

密码笔

原文由 tony19 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题