Vue笔记(五):自定义事件
时间:2022/01/15
首先给出示例代码,通过示例代码来说明为什么需要自定义事件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<todo>
<todo-title slot="todo-title" v-bind:title="title"></todo-title>
<todo-list slot="todo-list" v-for="(item, index) in items" v-bind:list="item"
v-on:remove="removeByIndex(index)"></todo-list>
</todo>
</div>
<script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
<script>
Vue.component("todo",{
template:'<div>\
<slot name="todo-title"></slot>\
<ul>\
<slot name="todo-list"></slot>\
</ul>\
</div>'
});
Vue.component("todo-title",{
props: ["title"],
template:'<div>{{title}}</div>'
});
Vue.component("todo-list",{
props: ["list"],
template: '<li>{{list}}<button v-on:click="remove">删除</button></li>',
methods: {
remove: function(){
this.$emit("remove");
}
}
});
var vm = new Vue({
el: "#app",
data: {
title: "图书列表",
items: ["Java", "Python", "Linux"]
},
methods: {
removeByIndex: function(index){
// 一次删除一个元素
this.items.splice(index, 1);
}
}
});
</script>
</body>
</html>
上面这段代码是在Vue笔记(四):插槽的基础上为每一个slot中的button按钮添加一个点击删除的函数。但是问题在于由于vm对象中的方法只能与前端进行交互,而相同的,组件component中的代码也只能与前端的代码进行交互,这就导致component中的代码无法直接调用vm对象中的删除函数,所以需要通过前端来实现一个中转,而自定义事件就能起到这样一个中转的作用。具体需要看<todo-list>标签中的代码,可以看到通过v-on将自定义的事件remove与vm对象中的removeByIndex方法绑定在了一起,这样在component的remove方法中就可以通过this.$emit获取到自定义的remove事件,也就可以通过这个事件调用到vm中的removeByIndex方法了。
努力,向上,自律

浙公网安备 33010602011771号