项目场景
[Day1]
<template>
<div id="app">
<h1>小黑记事本</h1>
<button @click="handleClick">www</button>
<div class="head">
<!-- 按键(回车)按下,出发add事件,和button的事件一样 -->
<input
@keyup.enter="add"
v-model="todoName"
type="text"
placeholder="请输入待办事项"
/>
<button @click="add">添加任务</button>
</div>
<section class="body">
<ul>
<li v-for="(item, index) in todoList" :key="item.id">
<span>{{ index + 1 }}</span>
<span class="content">{{ item.name }}</span>
<button @click="del">×</button>
</li>
</ul>
</section>
<div v-show="todoList.length > 0" class="footer">
<span
>合计:<strong>{{ todoList.length }}</strong></span
>
<button @click="clear()">清空任务</button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
todoName: "",
todoList: [
{ id: 1, name: "吃水果" },
{ id: 2, name: "喝酸奶" },
],
};
},
methods: {
handleClick(clickval) {
console.log("clickval", clickval);
console.log("clickval.target", clickval.target);
console.log("clickval.target.value", clickval.target.value);
},
del(tt) {
console.log("tt", tt);
this.todoList = this.todoList.filter((item) => item.id != tt);
},
add() {
if (this.todoName.trim() == "") {
alert("请输入内容");
return;
}
this.todoList.unshift({
id: +new Date(),
name: this.todoName,
});
this.todoName = "";
},
clear() {
this.todoList = [];
},
},
};
</script>
问题
在这段代码中,为什么在使用时没传递参数 <button @click=“del”>×,但是这里还是有参数传递进来了 del(tt) { console.log(“tt”, tt); this.todoList = this.todoList.filter((item) => item.id != tt); },
解答
在Vue中,当你在模板的某个元素上使用事件监听器(例如 @click=“del”),如果没有提供任何参数,Vue将默认传递原生的事件对象(通常表示为$event)作为参数至该方法。在你的代码中,<button @click=“del”>× 这段会在点击时自动传递点击事件的事件对象作为参数到 del 方法。
但是,根据你的 del 方法的实现和调用方式:
del(tt) {
console.log("tt", tt);
this.todoList = this.todoList.filter((item) => item.id != tt);
},
你似乎期望传入的参数是一个 id,而不是事件对象。为了使其按照期望工作,你应该在调用 del 方法时显式传递 item.id,类似这样:
<button @click="del(item.id)">×</button>
这样每个按钮就会调用 del 方法,并将其对应待办事项的 id 作为参数传进去,而不是事件对象。这将允许你根据 id 来过滤出不想要删除的待办事项。完整的 li 元素如下:
<li v-for="(item, index) in todoList" :key="item.id">
<span>{{ index + 1 }}</span>
<span class="content">{{ item.name }}</span>
<button @click="del(item.id)">×</button>
</li>
现在,每次点击删除按钮时,item.id 将被传递至 del 方法,然后用于从 todoList 数组中移除相应的待办事项。
其他例子
【day4】