在vue.js中使用动态行获取表中的选择标签值

时间:2019-04-25 02:09:08

标签: javascript vue.js vuejs2

我想在VM数据中设置选择标签的值。

<table id="vm" v-cloak>
  <thead>
    <tr>
      <th>Select</th><th>Operation</th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="(item, i) in rowData">
      <td>
        <select v-model="selected" @change="changeDate($event)">
          <option v-for="sItem in selectItems" :value="sItem.val">{{sItem.lbl}}</option>
        </select>
      </td>
      <td>
        <button @click="addRow(i)">+</button>
        <button @click="removeRow(i)">-</button>
      </td>
    </tr>
  </tbody>
</table>

我的脚本

// Select tag items
const SELECT_ITEMS = [
  {val:"1", lbl:"Val1"},
  {val:"2", lbl:"Val2"},
  {val:"3", lbl:"Val3"}
];

// my vm
new Vue({
  el: "#vm",
  data:{
    rowData:[{val:"1"},{val:"2"}],
    selected : '',
    selectItems : SELECT_ITEMS
  },
  methods:{
    // add new row
    addRow(i){
      let row = {
        val : this.selected,
      };
      this.rowData.splice(i, 0, row);
      this.val = '';
    },
    // remove current row
    removeRow(i){
      this.rowData.splice(i,1);
    },
    changeDate(e){
      // I want to set a value to item in rowData.
      console.log(e.target.value);
    }
  }
});

CodePen

我不知道如何将所选数据设置为rowData当前行的数据。

而且,更改一项将更改所有项目。

而且,我想在加载时添加选定的属性。

2 个答案:

答案 0 :(得分:1)

为什么不直接在rowData中使用v-model

Demo

<tr v-for="(item, i) in rowData">
  <td>
    <select v-model="rowData[i].val" @change="changeDate($event)">
      <option v-for="sItem in selectItems" :value="sItem.val">{{sItem.lbl}}</option>
    </select>
  </td>
  <td>
    <button @click="addRow(i)">+</button>
    <button @click="removeRow(i)">-</button>
  </td>
</tr>

答案 1 :(得分:0)

您的选择标签都绑定到同一变量。如果将模型设为rowData项的属性,则每行将获得唯一的值:

更改:v-model="selected" 到:v-model="item.value"

笔:https://codepen.io/anon/pen/QPJqqR?editors=0001

新模板:

<table id="vm" v-cloak>
  <thead>
    <tr>
      <th>Select</th><th>Operation</th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="(item, i) in rowData" :key="i">
      <td>
        <select v-model="item.value" @change="changeDate($event)">
          <option v-for="sItem in selectItems" :value="sItem.val">{{sItem.lbl}}</option>
        </select>
      </td>
      <td>
        <button @click="addRow(i)">+</button>
        <button @click="removeRow(i)">-</button>
      </td>
    </tr>
  </tbody>
</table>

在此示例中,item.value仅是一个选项,您可以使用喜欢的任何属性名称,例如item.rowName。它只是必须是rowData创建的item对象的属性。