阅读官方文档一开始没看懂,因为官方示例代码太偷懒了。只是第一遍写了下,后面代码没加入到源代码,以至于看不明白。
现在把完整代码组合起来,然后记录下自己的理解。
父组件(当前页面/外层文件)
new Vue({
el: '#blog-posts-events-demo',
data: {
posts: [/* ... */],
postFontSize: 1
},
methods: {
//enlargeAmount 来自子组件= 0.1
onEnlargeText: function (enlargeAmount) {
this.postFontSize += enlargeAmount
}
}
});
//使用子组件
<div id="blog-posts-events-demo">
<div :style="{ fontSize: postFontSize + 'em' }">
<blog-post
v-for="post in posts"
v-bind:key="post.id"
v-bind:post="post"
v-on:enlarge-text="postFontSize += $event" //接收从 blog-post 组件里面传递的虚拟事件,enlarge-text 是他们之间的暗号(虚拟事件),并收到一个值 $event (值是0.1)
// v-on:enlarge-text="onEnlargeText" //或者直接调用父组件的方法 onEnlargeText,并接受值 0.1
></blog-post>
</div>
</div>
子组件
Vue.component('blog-post', {
props: ['post'],
template: `
<div class="blog-post">
<h3>{{ post.title }}</h3>
<button v-on:click="$emit('enlarge-text', 0.1)"> //子组件监听真实点击事件,通过 $emit 发出一个暗号(虚拟事件)给使用者(父组件),并带上了一个值(0.1)
Enlarge text
</button>
<div v-html="post.content"></div>
</div>
`
})
事件处理流程个人理解:
1、点击“Enlarge text”按钮后,监听 click 事件并触发,使用子组件内 $emit() 给使用者(父组件)发送暗号(enlarge-text)和值(0.1)
2、等候多时的父组件,通过收到暗号(enlarge-text)和值($event),然后执行等于号(=)后面的表达式