【发布时间】:2023-03-09 15:07:01
【问题描述】:
我正在学习 vue,我想做的一件事就是克隆元素。我在玩这段代码:
var multiple = new Vue({
el: '#vue',
data: {
},
methods: {
cloneWidget(e) {
let widgets = document.getElementById('widgets');
let widget = document.getElementById('widget');
clone = widget.cloneNode(true);
clone.id = Math.round(Math.random()*100);
widgets.appendChild(clone);
},
deleteClone(e) {
e.target.parentNode.remove();
}
}
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link href="styles.css" rel="stylesheet" />
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-beta/css/materialize.min.css">
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<h1>Cloning</h1>
<div id="vue">
<form @submit.prevent>
<div id="widgets">
<div id="widget">
<div>
<label for="field1">Field 1:</label>
<input type="text" name="field1">
</div>
<div>
<label for="field2">Field 2:</label>
<input type="text" name="field2">
</div>
<i class="material-icons delete" @click="deleteClone">delete</i>
</div>
</div>
<button @click="cloneWidget">Add Widget</button>
</form>
</div>
<script src="app.js"></script>
</body>
</html>
但是,deleteClone 方法永远不会在原始div="widget" 之外调用。
我似乎无法弄清楚为什么事件侦听器没有附加到克隆。 cloneNode() 会弄乱 Vue 吗?
【问题讨论】:
-
你不能只克隆 dom 元素,因为 Vue 在底层也有虚拟 dom。您应该使用
v-for和一些带有数据的数组来操作“克隆”的集合。 Vue 是关于数据绑定和一般数据的,它不会像 jquery 那样与 dom 一起工作 -
感谢您的澄清
标签: javascript vue.js cloning