如何在 Vue.js 中取消绑定数组副本

How to unbind an array copy in Vue.js

我正在尝试将一个数组复制到另一个数组并像使用新数组一样使用它,而不对旧数组进行任何更改:

<div id="app">
    <div class="form-group">
       <label>Test input</label>
       <input v-model="testArray[0].name" type="text" class="form-control" placeholder="Input">
    </div>
    <br>
    <pre>testArray: {{ testArray[0] | json}}</pre>
    <pre>templateArray: {{ templateArray[0] | json  }}</pre>

new Vue({
  el: '#app',
  data: {
      testArray: [],
      templateArray: [{name: "TEST"},], 
  },
  ready: function() {
      this.testArray = this.templateArray.slice(0);
    },
});

问题是我正在更新新数组 'testArray' 我也更改旧数组 'templateArray'。

正在运行的脚本:https://jsfiddle.net/4po1cpkp/7/

有没有什么方法可以在不直接绑定到模板的情况下基于数组模板创建新数组?

如 Vue.js 文档所述:

Under the hood, Vue.js attaches a hidden property __ob__ and recursively converts the object’s enumerable properties into getters and setters to enable dependency collection. Properties with keys that starts with $ or _ are skipped.

您可以存储名称以下划线开头的模板数组:

  data: {
      testArray: [],
      _templateArray: [{ name: "TEST" }]
  },
  ready: function() {
      this.testArray = this.$data._templateArray;
  }

或者如果您需要它作为 Vue.js 对象:

this.testArray = JSON.parse(JSON.stringify(this.templateArray));

第二种情况对于大数据来说可能比较慢。

我在 Vue 2 中使用 Vue 扩展函数 Vue.util.extend 复制数组并取消绑定:

this.items_list.push(Vue.util.extend({}, this.list_item));

您可以使用数组原型的 slice()MDN Array.prototype.slice()

中阅读更多内容

this.testArray = [].slice.call(this.templateArray)