news 2026/4/23 15:50:08

Vue.js 组件 - 自定义事件【1】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue.js 组件 - 自定义事件【1】

父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件!

我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface),即:

  • 使用$on(eventName)监听事件
  • 使用$emit(eventName)触发事件

另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。

以下实例中子组件已经和它外部完全解耦了。它所做的只是触发一个父组件关心的内部事件。

实例

<div id="app"> <div id="counter-event-example"> <p>{{ total }}</p> <button-counter v-on:increment="incrementTotal"></button-counter> <button-counter v-on:increment="incrementTotal"></button-counter> </div> </div> <script> Vue.component('button-counter', { template: '<button v-on:click="incrementHandler">{{ counter }}</button>', data: function () { return { counter: 0 } }, methods: { incrementHandler: function () { this.counter += 1 this.$emit('increment') } }, }) new Vue({ el: '#counter-event-example', data: { total: 0 }, methods: { incrementTotal: function () { this.total += 1 } } }) </script>


尝试一下 »

如果你想在某个组件的根元素上监听一个原生事件。可以使用 .native 修饰 v-on 。例如:

<my-component v-on:click.native="doTheThing"></my-component>

data 必须是一个函数

上面例子中,可以看到 button-counter 组件中的 data 不是一个对象,而是一个函数:

data: function () { return { count: 0 } }

这样的好处就是每个实例可以维护一份被返回对象的独立的拷贝,如果 data 是一个对象则会影响到其他实例,如下所示:

实例

<div id="components-demo3" class="demo"> <button-counter2></button-counter2> <button-counter2></button-counter2> <button-counter2></button-counter2> </div> <script> var buttonCounter2Data = { count: 0 } Vue.component('button-counter2', { /* data: function () { // data 选项是一个函数,组件不相互影响 return { count: 0 } }, */ data: function () { // data 选项是一个对象,会影响到其他实例 return buttonCounter2Data }, template: '<button v-on:click="count++">点击了 {{ count }} 次。</button>' }) new Vue({ el: '#components-demo3' }) </script>


尝试一下 »


自定义组件的 v-model

组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件。

<input v-model="parentData">

等价于:

<input :value="parentData" @input="parentData = $event.target.value" >

以下实例自定义组件 runoob-input,父组件的 num 的初始值是 100,更改子组件的值能实时更新父组件的 num:

实例

<div id="app"> <runoob-input v-model="num"></runoob-input> <p>输入的数字为:{{num}}</p> </div> <script> Vue.component('runoob-input', { template: ` <p> <!-- 包含了名为 input 的事件 --> <input ref="input" :value="value" @input="$emit('input', $event.target.value)" > </p> `, props: ['value'], // 名为 value 的 prop }) new Vue({ el: '#app', data: { num: 100, } }) </script>



尝试一下 »

由于 v-model 默认传的是 value,不是 checked,所以对于复选框或者单选框的组件时,我们需要使用 model 选项,model 选项可以指定当前的事件类型和传入的 props。

实例

<div id="app"> <base-checkbox v-model="lovingVue"></base-checkbox> <div v-show="lovingVue"> 如果选择框打勾我就会显示。 </div> </div> <script> // 注册 Vue.component('base-checkbox', { model: { prop: 'checked', event: 'change' // onchange 事件 }, props: { checked: Boolean }, template: ` <input type="checkbox" v-bind:checked="checked" v-on:change="$emit('change', $event.target.checked)" > ` }) // 创建根实例 new Vue({ el: '#app', data: { lovingVue: true } }) </script>


尝试一下 »

实例中 lovingVue 的值会传给 checked 的 prop,同时当 <base-checkbox> 触发 change 事件时, lovingVue 的值也会更新。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:59:58

网易云音乐无损FLAC下载工具完整使用指南

网易云音乐无损FLAC下载工具完整使用指南 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为在线音乐的音质问题而烦恼吗&#xff1f;想要在本地保…

作者头像 李华
网站建设 2026/4/23 12:52:02

DLSS版本管理利器:5步掌握DLSS Swapper游戏优化技巧

DLSS版本管理利器&#xff1a;5步掌握DLSS Swapper游戏优化技巧 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 想要在游戏中获得更好的性能表现和画质体验吗&#xff1f;DLSS Swapper正是您需要的游戏优化工具&#x…

作者头像 李华
网站建设 2026/4/23 9:54:16

10分钟搞定英雄联盟智能插件:LeagueAkari实用手册

10分钟搞定英雄联盟智能插件&#xff1a;LeagueAkari实用手册 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还在为排队时…

作者头像 李华
网站建设 2026/4/23 9:52:19

通义千问2.5-7B-Instruct实时推理:低延迟优化技巧

通义千问2.5-7B-Instruct实时推理&#xff1a;低延迟优化技巧 1. 引言 随着大模型在实际业务场景中的广泛应用&#xff0c;对推理性能的要求日益提升。尤其是在对话系统、智能客服、代码辅助等需要低延迟响应的场景中&#xff0c;如何在有限硬件资源下实现高效推理成为关键挑…

作者头像 李华
网站建设 2026/4/23 10:49:06

SillyTavern桌面应用革命:告别命令行,拥抱一键启动新时代

SillyTavern桌面应用革命&#xff1a;告别命令行&#xff0c;拥抱一键启动新时代 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 还在为每次启动AI助手都要面对繁琐的命令行操作而烦恼吗&a…

作者头像 李华
网站建设 2026/4/23 10:50:00

sglang镜像性能优化:让bge-large-zh-v1.5推理速度提升50%

sglang镜像性能优化&#xff1a;让bge-large-zh-v1.5推理速度提升50% 1. 背景与挑战 随着大模型在语义理解、检索增强生成&#xff08;RAG&#xff09;等场景中的广泛应用&#xff0c;高效部署高质量的Embedding模型成为系统性能的关键瓶颈。bge-large-zh-v1.5作为当前中文领…

作者头像 李华