Vue自定义事件内容分发
这个案例也是狂神老师的。
现在说一下这个this.
e
m
i
t
(
′
方
法
′
,
′
参
数
′
)
,
这
个
触
发
自
定
义
事
件
,
而
自
定
义
事
件
需
要
在
组
件
的
头
上
面
写
v
−
o
n
:
命
名
(
′
想
要
调
用
的
方
法
′
)
。
看
上
去
非
常
复
杂
,
其
实
不
然
,
多
练
习
几
次
会
发
现
,
只
需
要
注
意
p
r
o
p
s
的
参
数
,
方
法
参
数
的
添
加
,
写
好
方
法
名
就
可
以
了
。
其
实
它
只
不
过
就
是
组
件
调
用
v
u
e
里
面
的
方
法
删
除
数
据
罢
了
,
通
过
视
图
的
一
个
小
操
作
,
相
当
于
是
给
V
u
e
.
c
o
m
p
o
n
e
n
t
和
V
u
e
对
象
做
一
个
连
接
,
也
就
是
这
个
v
−
o
n
就
是
一
个
连
接
,
而
emit('方法','参数'),这个触发自定义事件,而自定义事件需要在组件的头上面写v-on:命名('想要调用的方法')。 看上去非常复杂,其实不然,多练习几次会发现,只需要注意props的参数,方法参数的添加,写好方法名就可以了。其实它只不过就是组件调用vue里面的方法删除数据罢了,通过视图的一个小操作,相当于是给Vue.component和Vue对象做一个连接,也就是这个v-on就是一个连接,而
emit(′方法′,′参数′),这个触发自定义事件,而自定义事件需要在组件的头上面写v−on:命名(′想要调用的方法′)。看上去非常复杂,其实不然,多练习几次会发现,只需要注意props的参数,方法参数的添加,写好方法名就可以了。其实它只不过就是组件调用vue里面的方法删除数据罢了,通过视图的一个小操作,相当于是给Vue.component和Vue对象做一个连接,也就是这个v−on就是一个连接,而emit只是触发连接,调用方法而已。
需要注意问题:
- 如果有参数,别忘了在方法和props里面加上参数
- v-bind的意思其实就是绑定参数,告诉你这个是参数而已
- 请注意methods这些标签的书写
- 别忘记写数据在data上
- 自定义的标签别写错
下面是狂神老师总结的简图:
这样一来就清晰很多了。这里也发现了vue的操作很繁琐。需要多写。
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<tobo>
<tobo-title slot="title" :title="title"></tobo-title>
<!-- v-bind用于绑定参数,传入方法里面-->
<tobo-items slot="items" v-for="(item,index) in items" v-bind:item="item"
v-bind:index="index" v-on:remove="removeItems(index)"></tobo-items>
</tobo>
</div>
<script>
Vue.component("tobo",{
template:'<div>\
<slot name="title"></slot>\
<ul>\
<slot name="items"></slot>\
</ul>\
</div>'
})
Vue.component("tobo-title",{
props:['title'],
template:"<div>{{title}}</div>"
});
Vue.component("tobo-items",{
props:['item','index'],
template:"<li>{{index}}----{{item}}<button @click='remove'>删除</button></li>",
methods:{
remove:function(index){
this.$emit('remove',index);
}
}
});
var vue=new Vue({
el:"#app",
data:{
title:"好人",
items:['sss','aaa','bbb']
},
methods:{
removeItems:function(index){
//删除items里面的数据
console.log("删除"+index);
this.items.splice(index,1);
}
}
});
</script>
</body>
</html>