Vue v-on 对象式事件绑定:你不知道的 v-on 用法

113 阅读3分钟

同学们好,我是 Eugene(尤金),一名有多年前后台开发经验的前端工程师。

(Eugene 发音:/juːˈdʒiːn/,大家怎么顺口怎么叫就好)

你是否也有过:学过不少技术,到关键时刻说不清、写不出?

是否也曾怀疑自己,明明感觉会,却总是差一口气?

想系统梳理,又因为工作、家庭,时间总是不够。

技术行业逆水行舟,不进则退。

如果你也有类似困扰,不必焦虑。

从现在开始,跟着我一起心态归零,用碎片时间做一次彻底的前端基础扫盲

我们一起慢慢来,扎扎实实变强。

不搞花里胡哨的理论堆砌,只分享看得懂、用得上的前端干货

咱们一起稳步积累,真正摆脱“面向搜索引擎写代码”的尴尬。

一、v-on 是什么?

v-onVue 的事件绑定指令。在使用 Vxe Table 时,我注意到一种在公司项目里不多见的写法,这里分享给还不熟悉的同学。

// 此处复制的是 vxe-table 组件库的示例代码
<vxe-grid v-bind="gridOptions" v-on="gridEvents"></vxe-grid>

const gridEvents: VxeGridListeners = { 
    pageChange ({ pageSize, currentPage }) { 
        pagerVO.currentPage = currentPage
        pagerVO.pageSize = pageSize
        loadList()
    } 
}

很多人只知道 v-on 是 Vue 的事件绑定 API,常见写法是:

  • v-on:click="getInfo"
  • 或简写:@click="handleClick"

而在上面的代码里,v-on 后面直接接了 ="gridEvents",这并不是错误写法,而是 v-on 的对象式事件绑定。它和常见的 @click="handleClick" 是同一套机制,只是写法不同。

二、两种写法对比

1. 单个事件(常规写法)

@v-on: 的语法糖,两种写法等价:

<button @click="handleClick">点击</button>
<!-- 等价于 -->
<button v-on:click="handleClick">点击</button>

2. 对象式绑定(v-on="对象" 用法)

v-on 直接绑定一个事件对象,适合需要绑定多个事件的场景:

<vxe-grid v-on="gridEvents"></vxe-grid>

其中 gridEvents 是一个键值对对象

  • :事件名(如 pageChangecellClick
  • :对应的处理函数

Vue 会遍历这个对象,把每个键值对解析成「v-on:事件名 = 处理函数」并完成绑定。

三、在代码中的实际含义

以 vxe-table 的分页事件为例,事件对象定义如下(包含 TypeScript 类型):

const gridEvents: VxeGridListeners = {
  pageChange({ pageSize, currentPage }) {
    pagerVO.currentPage = currentPage
    pagerVO.pageSize = pageSize
    loadList()
  },
}

此时 v-on="gridEvents" 等价于:

<vxe-grid v-on:pageChange="gridEvents.pageChange"></vxe-grid>

如果 gridEvents 中有多个事件,Vue 会一次性完成绑定,例如:

// 包含多个事件的处理对象
const gridEvents = {
  pageChange: (e) => { ... },
  editClosed: (e) => { ... },
  cellClick: (e) => { ... },
}

等价于:

<vxe-grid
  v-on:pageChange="gridEvents.pageChange"
  v-on:editClosed="gridEvents.editClosed"
  v-on:cellClick="gridEvents.cellClick"
></vxe-grid>

四、为什么使用对象式事件绑定?

  1. 事件多时更简洁:不用在模板里写很多 v-on:xxx="xxx",一个 v-on="对象" 即可完成批量绑定。
  2. 便于维护:所有事件的处理函数集中在一个对象里,逻辑清晰,新增/修改/删除事件只需改对象,不用改模板。
  3. 适配组件库:vxe-table、Element Plus 等复杂组件(表格、树等)事件很多,用对象统一配置事件,结构更清晰。

学习本就是一场持久战,不需要急着一口吃成胖子。哪怕今天你只记住了一点点,这都是实打实的进步。

后续我还会继续用这种大白话、讲实战方式,带大家扫盲更多前端基础。

关注我,不迷路,咱们把那些曾经模糊的知识点,一个个彻底搞清楚。

如果你觉得这篇内容对你有帮助,不妨点赞+收藏,下次写代码卡壳时,拿出来翻一翻,比搜引擎更靠谱。

我是 Eugene,你的电子学友,我们下一篇干货见~