使用Vue动态添加/移除DOM元素

27

我已经开始学习Vue.js,但不知道如何在Vue.js中完成以下与jQuery相似的操作:

<!-- jQuery -->
<h2>jQuery</h2>
<table id="t1">
  <tr>
    <th>Item</th>
    <th>Quantity</th>
  </tr>
  <tr id="r1">
    <td><input name="item[]" type="text"/></td>
    <td><input name="quantity[]" type="number"/></td>
    <td><button class="deleteRow">X</button></td>
  </tr>
</table>
<button id="addRow">Add Row</button>

.js

// jQuery
$(document).on('click', '#addRow', function(){
    var row = parseInt($('#t1 tr:last-child').attr('id')) + 1;
    alert(row);
        $('#t1').append('<tr id="r'+row+'"><td><input name="item[]" type="text"/></td><td><input name="quantity[]" type="number"/></td><td><button class="deleteRow">X</button></td></tr>');
});

$(document).on('click', '.deleteRow', function(){
        var row = parseInt($(this).closest('tr').attr('id'));
    $('#r'+row).remove();
});

如何使用Vue在点击时创建一个全新的元素,并如何删除它?

这里所有内容都加载在 JSFiddle 中。

1个回答

63

VueJS是数据驱动的,所以不要直接操作DOM。

在下面的示例中,您将看到我定义了inputs数组 - 这是我们存储所有行的地方 - 因此它应该是对象数组。

在我们的模板中,我们通过v-for指令迭代遍历inputs数组,并为每个输入发送索引 - 用于删除行。

addRow是将新对象推送到我们的inputs数组(具有预定义模式)并赋予其唯一索引的方法。

以下是示例:http://jsbin.com/zusokiy/edit?html,js,output

模板:

  <div id="app">

    <ul>
      <li v-for="(input, index) in inputs">
        <input type="text" v-model="input.one"> - {{ input.one }}  
        <input type="text" v-model="input.two"> - {{ input.two }}
        <button @click="deleteRow(index)">Delete</button>
      </li>
    </ul>

    <button @click="addRow">Add row</button>

  </div>

JS:

const app = new Vue({

  el: '#app',

  data: {
    inputs: []
  },

  methods: {
    addRow() {
      this.inputs.push({
        one: '',
        two: ''
      })
    },
    deleteRow(index) {
      this.inputs.splice(index,1)
    }
  }

})

更好的选择可能是将它分解成组件,但目前为止,一切都还不错。


它能工作...但是你为什么把表格和行标签改成了无序列表和列表项呢?这有关系吗? - lewis4u
1
没关系,我只是用更快的方式 :) - Belmin Bedak
在Vue中,inputs这个词是一种关键字吗? - lewis4u
我不太确定,但也不能排除 - https://github.com/vuejs/vue/blob/dev/src/compiler/error-detector.js - Belmin Bedak
2
感谢@BelminBedak的建议:“VueJS是数据驱动的,所以不要直接操作DOM”,这让我恍然大悟,代码量减少了75%。我喜欢Vue! - dKen
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接