vue.js 监听子组件事件理解

整合 VueJs
阅读数: 928 2020年05月17日

阅读官方文档一开始没看懂,因为官方示例代码太偷懒了。只是第一遍写了下,后面代码没加入到源代码,以至于看不明白。
现在把完整代码组合起来,然后记录下自己的理解。

父组件(当前页面/外层文件)

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),然后执行等于号(=)后面的表达式



参考资料
https://cn.vuejs.org/v2/guide/components.html#监听子组件事件
phpriji.cn | 网站地图 | 沪ICP备17015433号-1