带有 v-for 的动态 v-model

Posted

技术标签:

【中文标题】带有 v-for 的动态 v-model【英文标题】:Dynamic v-model with v-for 【发布时间】:2018-11-03 18:18:20 【问题描述】:

我有一个 v-for 循环,它将吐出多行输入,我想将每一行动态保存到数组对象中。

v-for:

<table class="table m-0">
  <tbody>
    <tr v-for="fund in defaultFunds">
      <td>
        fund.name
        <b-input v-model="newEntries[fund.id]['id']" 
                 :value="fund.id" 
                 name="entryFund" 
                 type="text" 
                 class="d-none" 
                 :key="fund.id" />
      </td>
      <td>
        <b-input v-model="newEntries[fund.id]['amount']" 
                 name="newFundAmount" 
                 id="newFundAmount" 
                 type="text" 
                 placeholder="Amount" 
                 :key="fund.id"/>
      </td>
    </tr>
  </tbody>
</table>

想要的数组(以输入2行为例):

newEntries: [
   id: '1', amount: '50.00' ,
   id: '2', amount: '123.45' 
],

我默认将newEntries 加载为一个空数组。我不知道如何使用 v-for 获得我想要的那种数组对象。使用上面的代码,我最终得到了这个:

newEntries: [null, '50.00', '123.45']

我做错了什么?

【问题讨论】:

&lt;tr v-for="fund in defaultFunds" :key="fund.id"&gt; 密钥应该在这里,而不是b-input 【参考方案1】:

你想要这样的东西吗:

https://jsfiddle.net/e6L5seec/

<div id="app">
   newEntries:  newEntries 
   <table>
      <tr v-for="(fund, index) in defaultFunds">
         <td> fund.name </td>
         <td>
            <input    v-model="newEntries[index].id"
               name="entryFund"
               :value="fund.id"
               type="text"  />
         </td>
         <td>
            <input  v-model="newEntries[index].amount"
               name="entryFund" 
               type="text"  />
         </td>
      </tr>
   </table>
</div>

new Vue(
  el: "#app",
  data: function() 
    return 
          defaultFunds: [
      
        id: 0,
        name: 'fund 0'
      ,
      
        id: 1,
        name: 'fund 1'
      
    ],
    newEntries: [, ]
    
  ,
  methods: 
  
);

【讨论】:

就是这样,我实际上尝试过,但编译后,我在控制台中收到 javascript 错误,说无法读取未定义的属性 'id';但在我的 vue 检查器中,defaultFunds 是最明确定义的 defaultFunds的id是从1开始的吗?如果是,则会出现错误。您需要改用newEntries[fund.id + 1].id defaultFunds ids 可以是任何大于 0 的整数。我有一个 axios 调用将它们从数据库中拉出,因此它可以从 1 到无穷大。它不会总是以 1 开头,我需要对它做同样的事情吗? 如果是这种情况,您应该使用v-for="(fund, index) in defaultFunds"。我已经更新了我的答案。 谢谢@ittus!这正是我想要的。

以上是关于带有 v-for 的动态 v-model的主要内容,如果未能解决你的问题,请参考以下文章

v-for 按日期分组渲染项目

带有工厂功能的Vue组件v-for

带有 v-for 的 Vue 内联模板 - 未定义

Vue使用v-for时动态绑定ref(v-for组件内使用ref)

带有“v-for”的 b-tab 中的条件属性“lazy”

带有 bootstrap-vue 的 Vue:在列表中始终防止多个扩展列表元素(v-for)