阅读官方文档一开始没看懂,因为官方示例代码太偷懒了。只是第一遍写了下,后面代码没加入到源代码,以至于看不明白。
现在把完整代码组合起来,然后记录下自己的理解。
父组件(当前页面/外层文件)
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),然后执行等于号(=)后面的表达式