Vuejs和Vue.set(),更新数组

d7v8vwbk  于 2022-12-23  发布在  Vue.js
关注(0)|答案(5)|浏览(142)

我刚到Vuejs。做了一些东西,但我不知道这是简单/正确的方法。

我想要的

我想在一个数组中加入一些日期,并在发生事件时更新它们。首先我尝试了Vue.set,但没有成功。现在在更改数组项后:

this.items[index] = val;
this.items.push();

我push()nothing到数组中,它会更新..但是有时候最后一项会被隐藏,不知怎么的...我觉得这个解决方案有点老套,我怎么才能让它稳定呢?
简单代码如下:
x一个一个一个一个x一个一个二个一个x一个一个三个一个

ws51t4hk

ws51t4hk1#

编辑2

  • 对于需要React性的所有对象更改,请使用Vue.set(object, prop, value)
  • 对于阵列突变,您可以在此处查看当前支持的列表

编辑1

对于vuex,您将需要执行Vue.set(state.object, key, value)

原件

所以对于其他提出这个问题的人来说。它在Vue 2中的某个时候出现过。* 他们删除了this.items.$set(index, val)而支持this.$set(this.items, index, val)
剪接仍然是可用的,这里是一个链接到数组突变方法可在vue链接。

w51jfk4q

w51jfk4q2#

如果您像这样操作数组,VueJS无法拾取对状态的更改。
正如Common Beginner Gotchas中所解释的,应该使用数组方法,如push、splice或其他方法,并且永远不要像a[2] = 2这样修改索引,也不要修改数组的. length属性。

new Vue({
  el: '#app',
  data: {
    f: 'DD-MM-YYYY',
    items: [
      "10-03-2017",
      "12-03-2017"
    ]
  },
  methods: {

    cha: function(index, item, what, count) {
      console.log(item + " index > " + index);
      val = moment(this.items[index], this.f).add(count, what).format(this.f);

      this.items.$set(index, val)
      console.log("arr length:  " + this.items.length);
    }
  }
})
ul {
  list-style-type: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.11/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<div id="app">
  <ul>
    <li v-for="(index, item) in items">
      <br><br>
      <button v-on:click="cha(index, item, 'day', -1)">
      - day</button> {{ item }}
      <button v-on:click="cha(index, item, 'day', 1)">
      + day</button>
      <br><br>
    </li>
  </ul>
</div>
ndh0cuux

ndh0cuux3#

如前所述-VueJS不能简单地跟踪那些操作(数组元素赋值)。VueJS使用数组跟踪的所有操作都在这里。但我会再复制一次:

  • 推()
  • 弹出()
  • 移位()
  • 取消移位()
  • 拼接()
  • 排序()
  • 反转()

在开发过程中,您会面临一个问题--如何接受它:)。
push()、pop()、shift()、unshift()、sort()和reverse()非常简单,在某些情况下会有所帮助,但主要的焦点在于splice(),它允许您有效地修改VueJ跟踪的数组。因此,我可以分享一些处理数组最常用的方法。

    • 您需要替换数组中的项目:**
// note - findIndex might be replaced with some(), filter(), forEach() 
// or any other function/approach if you need 
// additional browser support, or you might use a polyfill
const index = this.values.findIndex(item => {
          return (replacementItem.id === item.id)
        })
this.values.splice(index, 1, replacementItem)

注意:如果您只需要修改项目字段,您可以通过以下方式进行修改:

this.values[index].itemField = newItemFieldValue

这将由VueJS跟踪,因为项目(对象)字段将被跟踪。

    • 您需要清空数组:**
this.values.splice(0, this.values.length)

实际上,你可以用这个函数做更多的事情,你可以添加多个记录,删除多个记录,等等。

    • 查看设置()和查看删除()**

Vue. set()和Vue. delete()可用于向UI版本的数据添加字段。例如,您需要在对象中添加一些额外的计算数据或标志。您可以为对象或对象列表(在循环中)执行此操作:

Vue.set(plan, 'editEnabled', true) //(or this.$set)

并将编辑后的数据以相同格式发送回后端,在Axios调用之前执行此操作:

Vue.delete(plan, 'editEnabled') //(or this.$delete)
7hiiyaii

7hiiyaii4#

另一种更轻量级的解决方法是,临时编辑数组,然后将整个数组赋回变量。因为Vue不监视单个项,它将监视整个变量的更新。
所以你应该也能做到:

var tempArray[];

tempArray = this.items;

tempArray[targetPosition]  = value;

this.items = tempArray;

这也应该更新您的DOM。

相关问题