1

我有<input>像这样的领域

<input type="text" v-model=user.name" />
<input type="text" v-model="user.phone" />
<button @click="add">add user</button>

每当我点击 时add user,它应该推user送到users数组并清除v-model(以推送更多用户)。我的add()方法如下所示。

add()
{
  this.users.push( this.user );
  this.user.name = '';
  this.user.phone = '';
}

然而,在重置后user v-model,数组中的元素users也变成了空字符串。如何在v-model不更改users数组中数据的情况下重置?

4

1 回答 1

0

最简单的方法是重置整个user对象而不是逐个属性:

add()
{
  this.users.push( this.user );
  this.user = {name: '', phone: ''};
}

演示:

new Vue({
  el: '#app',
  data: {
    user: {name: '', phone: ''},
    users: []
  },
  methods: {
    add() {
      this.users.push(this.user);
      this.user = {name: '', phone: ''};
    }
  }
})
<script src="https://unpkg.com/vue"></script>

<div id="app">
  name: <input type="text" v-model="user.name" /><br>
  phone: <input type="text" v-model="user.phone" /><br>
  <button @click="add">add user</button>
  <hr>
  users: {{ users }}
</div>

为什么它不起作用?

因为当你这样做时:

this.users.push( this.user );
// this changes the name of the user that happens to be inside the users array
this.user.name = '';

您正在将其添加this.userthis.users数组中。如果您稍后更改它,例如this.user.name = 'something';,您正在更改同一个对象(现在this.users也在数组内部)。

另一方面,当覆盖它时,它是一个新对象:

this.users.push(this.user);
this.user = {name: '', phone: ''};
// the line above makes `this.user` point to (reference) a new object.
// the object that was pushed into the array still exists, but this.user does not point to it anymore
// the line below sets the name of the user created in the line above, not the previous (that is in the array)
this.user.name = 'bob';

替代方案:克隆。

如果你想走这条路,你会有一些选择。从“手动”克隆:

new Vue({
  el: '#app',
  data: {
    user: {name: '', phone: ''},
    users: []
  },
  methods: {
    add() {
      this.users.push({name: this.user.name, phone: this.user.phone});
      this.user.name = '';
      this.user.phone = '';
    }
  }
})
<script src="https://unpkg.com/vue"></script>

<div id="app">
  name: <input type="text" v-model="user.name" /><br>
  phone: <input type="text" v-model="user.phone" /><br>
  <button @click="add">add user</button>
  <hr>
  users: {{ users }}
</div>

深度克隆:

new Vue({
  el: '#app',
  data: {
    user: {name: '', phone: ''},
    users: []
  },
  methods: {
    add() {
      let userDeepClone = JSON.parse(JSON.stringify(this.user));
      this.users.push(userDeepClone);
      this.user.name = '';
      this.user.phone = '';
    }
  }
})
<script src="https://unpkg.com/vue"></script>

<div id="app">
  name: <input type="text" v-model="user.name" /><br>
  phone: <input type="text" v-model="user.phone" /><br>
  <button @click="add">add user</button>
  <hr>
  users: {{ users }}
</div>

浅克隆:

new Vue({
  el: '#app',
  data: {
    user: {name: '', phone: ''},
    users: []
  },
  methods: {
    add() {
      let userShallowClone = {...this.user}; // or Object.assign({}, this.user);
      this.users.push(userShallowClone);
      this.user.name = '';
      this.user.phone = '';
    }
  }
})
<script src="https://unpkg.com/vue"></script>

<div id="app">
  name: <input type="text" v-model="user.name" /><br>
  phone: <input type="text" v-model="user.phone" /><br>
  <button @click="add">add user</button>
  <hr>
  users: {{ users }}
</div>

于 2018-04-07T22:39:31.467 回答