子级向父级传递—自定义事件
当子组件需要向父组件传递数据时,用到的是自定义事件 自定义事件的流程:
在子组件中,通过$emit()来触发事件。 在父组件中,通过v-on来监听子组件事件。 我们来看一个简单的例子:
我们之前做过一个两个按钮+1和-1,点击后修改counter。 我们整个操作的过程还是在子组件中完成,但是之后的展示交给父组件。 这样,我们就需要将子组件中的counter,传给父组件的某个属性,比如total。
< div id = " app" >
< cpn @item-click = " cpnClick" > </ cpn>
</ div>
< template id = " cpn" >
< div>
< button v-for = " item in categories" @click = " btnClick(item)" >
{{item.name}}
</ button>
</ div>
</ template>
< script src = " ../js/vue.js" > </ script>
< script>
const cpn = {
template : '#cpn' ,
data ( ) {
return {
categories : [ {
id : 'aaa' ,
name : '热门推荐'
} ,
{
id : 'bbb' ,
name : '手机数码'
} ,
{
id : 'ccc' ,
name : '家用家电'
} ,
{
id : 'ddd' ,
name : '电脑办公'
} ,
]
}
} ,
methods : {
btnClick ( item ) {
this . $emit ( 'item-click' , item)
}
}
}
const app = new Vue ( {
el : '#app' ,
data : {
message : '你好啊'
} ,
components : {
cpn
} ,
methods : {
cpnClick ( item ) {
console. log ( 'cpnClick' , item) ;
}
}
} )
</ script>
重点来了!!!!
这里的父组件是app
,子组件是cpn
在父组件子标签 中,通过v-on来监听子组件事件 并添加一个响应该事件的处理方法,即监听的事件应该写在子组件cpn
在父组件app
里调用的标签 上,而不是写在app
上 这里的父组件触发其实是指的在父组件的作用域 下,在子组件上v-on:
触发,很久之前学的Vue了,今天做项目的时候写的时候写到app
上了,还是自己太粗心了
< div id = " app" >
< cpn @item-click = " cpnClick" > </ cpn>
</ div>