vue组件---自定义事件
首先简单回顾下组件事件及组件的复用
demo1:按钮事件
<div class="button_area">
<button-area></button-area>
<button-area></button-area>
<button-area></button-area>
</div>
<script type="text/javascript">
// 1、注册组件
Vue.component('button-area',{
data:function(){
return {
count:
}
},
template:`<button v-on:click="count++">您点击了{{count}}次</button>`
})
// 2、实例化,构建组件模板
new Vue({
el:".button_area"
})
</script>

demo2:监听子组件事件
在开发 <event-area> 组件时,它的一些功能可能要求我们和父级组件进行沟通。例如我们可能会引入一个可访问性的功能来放大博文的字号,同时让页面的其它部分保持默认的字号。在其父组件中,可以通过添加一个 blogFontSize数据属性来支持这个功能:
new Vue({
el:".event_area",
data:{
blogs:[
{id:,title:"文章标题1",content:"文章内容1..."},
{id:,title:"文章标题2",content:"文章内容2..."},
{id:,title:"文章标题3",content:"文章内容3..."},
],
blogFontSize:
}
})
它可以在模板中用来控制所有博文的字号:
v-bind:style="{fontSize:blogFontSize+'em'}"

接下来添加按钮,点击放大字体。当点击这个按钮时,需要告诉父级组件放大所有博文的文本。Vue 实例提供了一个自定义事件的系统来解决这个问题。父级组件可以像处理 native DOM (本地DOM)事件一样通过 v-on 监听子组件实例的任意事件:
v-on:add-size="blogFontSize+=0.1"
子组件可以通过调用内建的 $emit 方法 并传入事件名称来触发这个事件
Vue.component('event-area',{
props:['blog'],
template:`<div class="blog_show_area">
<p>标题:{{blog.title}}</p>
<p>内容:{{blog.content}}</p>
<button v-on:click="$emit('add-size')">放大字体</button>
</div>`
});
有了这个 v-on:add-size="blogFontSize += 0.1" 监听器,父级组件就会接收该事件并更新 blogFontSize 的值。完整代码
<div class="event_area">
<event-area
v-for="blog in blogs"
v-bind:key="blog.id"
v-bind:blog="blog"
v-bind:style="{fontSize:blogFontSize+'em'}"
v-on:add-size="blogFontSize+=0.1"
></event-area>
</div>
<style type="text/css">
.blog_show_area{
padding: 20px;
background-color: rgba(,,,.);
border: 1px solid red;
margin: 10px;
}
</style>
Vue.component('event-area',{
props:['blog'],
template:`<div class="blog_show_area">
<p>标题:{{blog.title}}</p>
<p>内容:{{blog.content}}</p>
<button v-on:click="$emit('add-size')">放大字体</button>
</div>`
});
new Vue({
el:".event_area",
data:{
blogs:[
{id:,title:"文章标题1",content:"文章内容1..."},
{id:,title:"文章标题2",content:"文章内容2..."},
{id:,title:"文章标题3",content:"文章内容3..."},
],
blogFontSize:
}
})

(1)事件名
不同于组件和 prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称。举个例子,如果触发一个 addSize名字的事件:
组件template里:
<button v-on:click="$emit('addSize')">放大字体</button>
则监听这个名字的 kebab-case (短横线隔开式)版本是不会有任何效果。
<event-area
v-for="blog in blogs"
v-bind:key="blog.id"
v-bind:blog="blog"
v-bind:style="{fontSize:blogFontSize+'em'}"
v-on:add-size="blogFontSize+=0.1"
></event-area>
<!--没有效果-->
不同于组件和 prop,事件名不会被用作一个 JavaScript 变量名或属性名,所以就没有理由使用 camelCase 或 PascalCase 了。并且 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 v-on:myEvent 将会变成 v-on:myevent——导致 myEvent 不可能被监听到。因此,推荐始终使用 kebab-case 的事件名。
测试:这里使用PascalCase (小驼峰式)版本命名调用
父级组件:
v-on:addSize="blogFontSize+=0.1"
子级模板中:
<button v-on:click="$emit('addSize')">放大字体</button>
此时,控制台输出警告

翻译:
请注意,HTML属性不区分大小写,并且在使用in-DOM模板时不能使用v-on来侦听camelCase事件。 您应该使用“add-size”而不是“addSize”。
(2)自定义组件的v-model(待验证)
(3)将原生事件绑定到组件(待验证)
(4).sync修饰符(待验证)
.
.sync 修饰符
vue组件---自定义事件的更多相关文章
- Vue基础-自定义事件的表单输入组件、自定义组件的 v-model
Vue 测试版本:Vue.js v2.5.13 学习 Vue 的自定义事件的表单输入组件,觉得文档讲的不太细致,所以这里再细化一下: 如果不用 v-model,代码应该是这样: <myinput ...
- vue组件添加事件@click.native
1,给vue组件绑定事件时候,必须加上native ,否则会认为监听的是来自Item组件自定义的事件 2,等同于在子组件中: 子组件内部处理click事件然后向外发送click事件:$emit(&q ...
- Vue3手册译稿 - 深入组件 - 自定义事件
本章节需要掌握组件基础 emit我译成发射,觉得发射这个词比较形象的形容将子组件事件发射出来的一个动作. 事件名 像组件和props,事件名也会进行自动转换,如果你在子组件里发射一个驼峰命名的事件,你 ...
- vue-gemini-scrollbar(vue组件-自定义滚动条)
vue-gemini-scrollbar(vue组件-自定义滚动条) https://segmentfault.com/a/1190000013338560
- Vue.js 源码分析(十四) 基础篇 组件 自定义事件详解
我们在开发组件时有时需要和父组件沟通,此时可以用自定义事件来实现 组件的事件分为自定义事件和原生事件,前者用于子组件给父组件发送消息的,后者用于在组件的根元素上直接监听一个原生事件,区别就是绑定原生事 ...
- Vue学习之--------组件自定义事件(绑定、解绑)(2022/8/21)
文章目录 1.基础知识 2.代码实例 2.1 App.vue 2.2 school.vue 2.3 student.vue 3.测试效果(略) 4.实际应用(在组件化编码实战三的基础上改进) 4.1 ...
- vue.js 自定义事件
<div id="app"> <h2>{{num}}</h2> <h1>全局组件</h1> <my-compone ...
- vue组件原生事件以及路由
1.组件 组件就是可以扩展HTML元素,封装可重用的HTML代码,可以将组件看作自定义的HTML元素 1.1组件注册 全局注册: 组件注册时,需要给他一个名字,如下: Vue.component('m ...
- vue组件之事件
自定义事件 通过prop属性,父组件可以向子组件传递数据,而子组件的自定义事件就是用来将内部的数据报告给父组件的. <div id="app3"> <my-com ...
随机推荐
- 简单区分iphone和ipad的宏定义
在公共头文件里作例如以下定义: #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 使用时: if( IS_I ...
- xenserver PXE安装系统错误的解决
刚开始在xenserver里找pxe启动安装系统找了半天,最后在NEW VM里的template里选择other install media 里找到pxe启动,启动之后加载映像,安装到一半又停止了, ...
- Android MaoZhuaWeiBo开发Service抓取个人信息-2
前面把基本的东西讲完了,之后就是数据的获取和解析显示出来了,那接下来我们就负责抓取数据的这块吧,首先我们须要 在清单文件中载入服务和活动 加入:. <activity android:name= ...
- HDU 5475An easy problem 离线set/线段树
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- Interval 计时器
语法: setInterval(代码,交互时间); 在执行时,从载入页面后每隔指定的时间执行代码. clearInterval( setInterval() 返回的 ID 值 ): 取消计时器 < ...
- 洛谷P1850 [noip2016]换教室——期望DP
题目:https://www.luogu.org/problemnew/show/P1850 注释掉了一堆愚蠢,自己还是太嫩了... 首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选 ...
- Eclipse使用Tomcat发布项目时出现YadisException异常解决方案
调整使用Eclipse的JDK版本,大概JDK版本过低会出现这个org.openid4java.discovery.yadis.YadisException: 0x704: I/O transport ...
- 引水入城 2010年NOIP全国联赛提高组(bfs+贪心)
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远 ...
- GIT学习之路第三天 文件操作
本文参考廖雪峰老师的博客进行总结,完整学习请转廖雪峰博客 一.版本回退 1.git log提交日志 在git中可以通过个git log 命令显示从最近到最远的提交日志. $ git log commi ...
- Linux环境下卸载、安装及配置MySQL5.1
Linux环境下卸载原有MySQL5.1数据库,并重新安装MySQL数据库的示例记录. 一.卸载MySQL 查看主机中是否安装了MySQL数据库: [root@RD-viPORTAL- ~]# rpm ...