开发者学堂课程【Vue.js 入门与实战:组件传值-子组件通过事件调用向父组件传值】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/586/detail/8186
组件传值-子组件通过事件调用向父组件传值
之前学习了父组件向子组件传值,此时传递的 msg 没有任何特点,只是一个数据,现在学习一些特殊的内容:
当父组件只有一个简单的内容,想要把父组件当中的一些方法传递给子组件的话,需要如下代码:
<div id=
”
app
”
>
</div>
<template id=
”
tmp
1
”>
</div>
<h1>这是 子组件</h1>
//定义了一个字面量类型的组件模板对象
var com2 = {
template:
’
#tmpl
’
//通过指定了一个Id,表示说要去加载这个指定的Id的template元素中的内容,当作组件的HTML结构
此时,组件模版对象已经定义结束。但是不可以直接使用到 app 中,因为这只是一个变量,并不是一个组件的名称,如果想引用的话,一种是全局通过 vue.compoment 去注册,一种是在组件 vm 内部通过compoments 去定义。
<body>
<div id=
”
app
”
>
<com2></com2>
</div>
此时执行命令,可以看到执行结果为:
显示正常, 且没有报错。
现在的需求是把方法传递给子组件,所以需要在父组件 vm 身上定义一个方法,代码如下:
//创建Vue实例,得到ViewModel
var vm = new Vue({
el:
’
#app
’
,
data: {
},
methods: {
show() {
//console.log(
‘
调用了父组件身上的show方法:---
’
)
}
}
,
现在想要把 show 方法传递给子组件,传递方法时只能通过事件绑定机制去自定义一个时间属性,需要编辑子组件:
<body>
<div id=
”
app
”
>
<com2 v-on:func=
”
show
”
></com2>
</div>
<!--父组件向子组件传递方法,使用的是事件绑定机制;v-on,当我们自定义了一个事件属性之后,那么,子组件就能够通过某些方式,来调用传递进去的这个方法了-->
现在,子组件身上已经有了一个 func 的方法,后面的表达式不可以随便写,而前面的名称可以随便写。Show 的后面没带引号和小括号代表方法的引用原封不动交给 func 去保存一份,这样在com2 中就可以直接使用 func 这个方法。
<div id=
”
app
”
>
<com2 v-on:func123=
”
show
”
></com2>
</div>
<template id=
”
tmpl”>
<div>
<hl>这是子组件</hl>
<input type=”button” value=”这是子组件的按钮-点击它,触发父组件传递过来的 func 方法”>
执行可以看到已经有了这个现实,但是点击没有效果,因为并没有给其绑定事件。此时将以上代码修改为:
<input type=”button” value=”这是子组件的按钮-点击它,触发父组件传递过来的 func 方法”@click=“myclick”>
此时执行,可以进行点击。所以:
//当点击子组件的按钮的时候,如何拿到父组件传递过来的func方法,并调用这个方法,这是我们需要考虑的一个问题。
//emit英文原意:触发、调用、发射
//this.$emit(
‘
func
’
this.$emit(
‘
func123
’
,)
}
保存,刷新后,查看执行结果,此时输出内容为:调用了父组件身上的 show 的方法。
通过事件绑定机制,我们把父组件的 show 方法传递给了子组件。
//创建Vue实例,得到ViewModel
var vm = new Vue({
el:
’
#app
’
,
data: {
},
methods: {
show(
data
) {
//console.log(
‘
调用了父组件身上的show方法:---
’
+data
)
}
},
这个方法父组件没有自己调用,而是通过传递给子组件,而这只是调用,而没有传参,应该:
//this.$emit(
‘
func123
’
,123,456)
this.$emit(
‘
func123
’
,123,)
此时执行结果,可以看到此时输出内容为:调用了父组件身上的 show 的方法---123456.这是调用父组件方法,并向父组件传参。
data() {
return {
sonmsg: (name:
’
小头儿子
’
,age:6)
}
},
methods:{
myclick() {
//this.$emit(
‘
func
’
,
this.sonmsg)
Console.log(data)
Datamsgformson:null
This.Datamsgformson=date
此时点击执行,可以发现,方法和信息已经传递过来了。
由此可以总结,本质上是,父组件给子组件传递一个方法后,子组件需要想办法去调用,在调用的时候,可以把子组件的数据顺便当做数据参数传递进去,父组件就可以拿到传递的数据。