【问题标题】:Vue two-way data binding issuevue 双向数据绑定问题
【发布时间】:2020-06-11 18:37:15
【问题描述】:

我自己的 vue 组件发送 http 请求来接收对象数组,然后我将答案存储在 data 属性中,就可以了。现在我想把这个数组绑定到 v-model,但是当用户输入一些东西时,我的数组也会改变。我想存储数组以供以后使用并使其不可编辑,我只想将其值绑定到 v-model,而不是引用我的数组。我的目标是允许用户将 v-model 值重置为从 api 接收的数组。我希望你明白这一点,你将能够帮助我。

<draggable v-model="myArray">
   <div v-for="element in myArray" :key="element.id">{{element.name}}</div>
</draggable>
<button @click="addElement">New</button>
data() {
   return {
       myArray: [],
       array: []
   }
},
methods: {
   addElement() {
      myArray.push({id:1, name:'something'});
   },
   getData() {
      axios(...)
      .then(res => {
         this.array = response.data;
      });
   }
   setData() {
      this.myArray = this.array;
   }
}

现在如果用户将新元素添加到myArray,它也会插入到array

【问题讨论】:

  • 您是否尝试过使用array.maparray.filter 或类似的方法传递克隆数组?
  • 我已经更新了帖子,现在你可以看到代码了,@Darius,是的,我已经尝试过了,但得到了相同的结果。

标签: javascript vue.js v-model


【解决方案1】:

我使用 JSON 解析解决了一个类似的问题,以使要复制的数组与要创建的数组具有松散的动态关系。请尝试以下操作:

data() {
   return {
       myArray: [],
       array: []
   }
},
methods: {
   addElement() {
      myArray.push({id:1, name:'something'});
   },
   getData() {
      axios(...)
      .then(res => {
         this.array = response.data;
      });
   }
   setData() {
      this.myArray = JSON.parse(JSON.stringify(this.array)); // Here goes the trick
   }
}

这样用户对 v-model 数组的每次更改都不会反映在 myArray 上,因为在用户交互之前至少调用了一次 setData()。

希望它适合你。

【讨论】:

    【解决方案2】:

    必须克隆数据:

    new Vue({
      template: '<div>List1:<ul><li v-for="i in array1" :key="i.id">{{i.name}}</li></ul>List2:<ul><li v-for="i in array2" :key="i.id">{{i.name}}</li></ul><button @click="add">Add</button></div>',
      data: {
        array1: [{id:1, name:'Item1'},{id:2, name:'Item2'}],
        array2: []
      },
      created() {
        // clone array
        this.array2 = this.array1.map(i => Object.assign({},i))
      },
      methods: {
        add() {
          this.array1.push({id:this.array1.length+1, name:'Item'+(this.array1.length+1)})
          this.array1[0].name = 'Item1/' + this.array1.length
        }
      }
    }).$mount('div')
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    <div></div>

    如果是更复杂的对象数组,则必须使用某种深度克隆。

    【讨论】:

    • 我试过用Object.create而不是Object.assign,这就是问题所在,非常感谢!
    猜你喜欢
    • 2014-01-30
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多