【问题标题】:How to combine v-for and v-model to edit a list of objects?如何结合 v-for 和 v-model 来编辑对象列表?
【发布时间】:2019-01-07 00:45:03
【问题描述】:

我想编辑使用 Vue.js 的用户列表。每个用户都有姓名和年龄。似乎v-for 是处理列表的正确指令,v-model 是将input 的内容绑定到列表中特定元素的正确指令。

所以我尝试这样实现:

new Vue({
  el: '#exercise',
  data: {
    users: [{
      name: "martin",
      age: 32
    }]
  },
  methods: {
    add_user: function() {
      this.users.push({
        name: "",
        age: ""
      });
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="exercise">
  <form id="list">
    <div></div>
    <div v-for="user in users">
      <input v-model="user.name">
      <input v-model="user.age">
      <button @click="add_user">+</button>
    </div>
  </form>
</div>

但是,一旦我单击按钮添加新用户,带有输入字段的新行仅显示几分之一秒然后消失,留下的用户列表仅包含一个元素。

拜托,你能告诉我我做错了什么吗?

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    按钮正在提交表单,添加.prevent停止动作:

    new Vue({
      el: '#exercise',
      data: {
        users: [{
          name: "martin",
          age: 32
        }]
      },
      methods: {
        add_user () {
          this.users = [ ...this.users, {
            name: "",
            age: ""
          }]
        }
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    
    <div id="exercise">
      <form id="list">
        <div v-for="(user, index) in users" :key="index">
          <input v-model="user.name" :key="`name-${index}`">
          <input v-model="user.age" :key="`age-${index}`">
        </div>
        <button @click.prevent="add_user">+</button>
      </form>
    </div>

    【讨论】:

    • &lt;button type="button" @click="add_user"&gt;+&lt;/button&gt; 在语义上更正确。对于.prevent,代码显示“这是一个提交按钮(默认),但不要提交任何内容。”对于特定类型,代码不会假装它是提交按钮。
    【解决方案2】:

    您需要设置按钮的类型,因为它位于表单内,它会回退到提交按钮。

    另外,最好定义一个 :key 来帮助 vue 区分 v-for 上的一行与另一行之间的区别。

    new Vue({
      el: '#exercise',
      data: {
        users: [{
          id:new Date().getTime(),
          name: "martin",
          age: 32
        }]
      },
      methods: {
        add_user: function() {
          this.users.push({
            id:new Date().getTime(),
            name: "",
            age: ""
          });
        }
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    
    <div id="exercise">
      <form id="list">
        <div v-for="user in users" :key="user.id">
          <input v-model="user.name">
          <input v-model="user.age">
          <button type="button" @click="add_user">+</button>
        </div>
      </form>
    </div>

    【讨论】:

      【解决方案3】:

      原因是&lt;button&gt;&lt;form&gt; 当您单击按钮时,它会自动执行请求,因此它会刷新或消失,因为它无法尝试使用&lt;a&gt; 或使用&lt;button @click.prevent="add_user" /&gt;

      <div id="exercise">
        <form id="list">
          <div></div>
          <div v-for="user in users">
            <input v-model="user.name">
            <input v-model="user.age">
            <a @click="add_user">+</a> //solution
            <button @click.prevent="add_user">+</button> //another solution 
          </div>
        </form>
      </div>
      

      【讨论】:

      • 没错,但更好的解决方案是将type="button" 添加到&lt;button&gt; 元素,因为从语义上讲,这不是链接
      • 所以使用@click.prevent
      猜你喜欢
      • 2020-07-18
      • 1970-01-01
      • 2019-12-16
      • 2020-05-05
      • 2020-12-12
      • 2022-09-30
      • 2020-02-25
      • 2019-04-30
      • 1970-01-01
      相关资源
      最近更新 更多