vue中的事件绑定的过程

Vue中事件的绑定分为两种情况:原生DOM事件和组件事件。

原生DOM事件

是指在模板中使用v-on或@指令来给元素绑定的事件,如

<button @click="handler">click me</button>

这种事件的绑定是通过以下步骤实现的:

  • 模板编译阶段,Vue会解析v-on/@指令,生成相应的AST节点,其中包含事件名和事件处理函数的信息。
  • 生成render函数阶段,Vue会根据AST节点生成v-on/@指令对应的代码,如on: {click: handler},并将其作为VNode的属性。
  • 创建真实DOM节点阶段,Vue会调用createElm函数,其中会调用invokeCreateHooks函数,遍历执行平台相关的钩子函数,其中就有updateDOMListeners函数,该函数负责比较新旧VNode的事件监听器,添加或移除相应的事件绑定,使用原生的addEventListener和removeEventListener方法。

组件事件

是指在组件中使用$emit方法来触发的事件,如this.\$emit('submit', payload)

这种事件的绑定是通过以下步骤实现的:

  • 在组件的选项中,可以通过emits属性或defineEmits函数来声明要触发的事件,这样可以在代码中作为文档记录组件的用法,也可以对事件的参数进行类型校验,提高代码的可维护性和健壮性。
  • 在组件的模板中,可以使用v-on或@指令来监听组件事件,如
     <MyComponent @submit="callback" />
    
    这样会将事件监听器作为VNode的属性传递给组件。
  • 在组件的实例中,可以使用$emit方法来触发组件事件,如this.\$emit('submit', payload)。这个方法会在当前组件实例上触发一个自定义事件,同时传递给它一些参数。
  • 在组件的渲染过程中,Vue会调用updateComponentListeners函数,该函数会遍历组件VNode的事件监听器,将其添加到组件实例的_events属性中,该属性是一个事件名和事件处理函数的映射表。
  • 在组件的$emit方法中,Vue会根据事件名在_events属性中查找对应的事件处理函数,如果存在,则依次执行它们,并传递事件参数。

相关推荐

  1. vue事件过程

    2023-12-29 18:54:03       32 阅读
  2. Vue2:用ref方式自定义事件注意事项

    2023-12-29 18:54:03       38 阅读
  3. VueClass和style方式

    2023-12-29 18:54:03       20 阅读
  4. vue双向数据v-model理解

    2023-12-29 18:54:03       19 阅读
  5. Vue双向数据是如何实现

    2023-12-29 18:54:03       10 阅读
  6. vue

    2023-12-29 18:54:03       14 阅读
  7. React16源码: Reactevent事件监听源码实现

    2023-12-29 18:54:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 18:54:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 18:54:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 18:54:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 18:54:03       20 阅读

热门阅读

  1. 备份文件..

    2023-12-29 18:54:03       33 阅读
  2. Docker构建zookeeper集群

    2023-12-29 18:54:03       40 阅读
  3. Leetcode 2976. Minimum Cost to Convert String I

    2023-12-29 18:54:03       48 阅读
  4. LeetCode 26 删除有序数组中的重复项

    2023-12-29 18:54:03       35 阅读
  5. 复杂度与顺序表

    2023-12-29 18:54:03       46 阅读
  6. var、let 和 const声明的变量有什么区别

    2023-12-29 18:54:03       39 阅读
  7. 本地缓存Caffeine的使用

    2023-12-29 18:54:03       42 阅读
  8. 入门Python笔记详细介绍

    2023-12-29 18:54:03       39 阅读
  9. SpringCloud实战之Kubernetes项目运行示例

    2023-12-29 18:54:03       30 阅读
  10. js随机生成背景

    2023-12-29 18:54:03       35 阅读
  11. 前端跨页面通信方法

    2023-12-29 18:54:03       40 阅读
  12. 给软件行业年轻人的2024新年寄语

    2023-12-29 18:54:03       39 阅读
  13. c# CultureInfo 总结

    2023-12-29 18:54:03       37 阅读
  14. python合并多个PDF,成为1个PDF

    2023-12-29 18:54:03       41 阅读
  15. 蓝桥杯宝藏排序2题目(快速,归并,桶排序)

    2023-12-29 18:54:03       41 阅读
  16. 蓝桥杯-每日刷题-029

    2023-12-29 18:54:03       36 阅读