首先简单回顾下组件事件及组件的复用

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 修饰符

最新文章

  1. React Native props &amp; state
  2. 【转载、推荐】不要自称是程序员,我十多年的 IT 职场总结
  3. navigationBar设置透明度
  4. SpringDataMongoDB介绍(一)-入门
  5. c程序设计语言_习题1-13_统计输入中单词的长度,并且根据不同长度出现的次数绘制相应的直方图
  6. Going Home - poj 2195(最小费用流 | 二分匹配)
  7. R语言做文本挖掘 Part5情感分析
  8. MariaDB10自动化安装部署
  9. 201521123009 《Java程序设计》第10周学习总结
  10. Laravel框架使用查询构造器实现CURD
  11. web.xml is missing and &lt;failOnMissingWebXml&gt; is set to true
  12. Java基础 -- Java 抽象类 抽象方法
  13. 经验分享:PDF怎么提取页面
  14. sqoop碰到的问题
  15. react-router的坑
  16. CVE-2017-16995 漏洞利用
  17. PHP - CentOS下开发运行环境搭建(Apache+PHP+MySQL+FTP)
  18. 快速幂-hdu1097
  19. 杭州.Net 相关大公司,希望对大家有帮助
  20. Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级

热门文章

  1. Hdu2111
  2. HDU 1269 迷宫城堡 最大强连通图题解
  3. Java中的Nested Classes和Inner Classes
  4. web 开发之js---js 调用视频播放
  5. 2016/1/1 运算符 笔记整理 接2015/12/30 Java 语法
  6. ZOJ 3870 Team Formation 贪心二进制
  7. luogu 3371 【模板】单源最短路径
  8. 【POJ 1201】 Intervals
  9. FastText 分析与实践
  10. sshfs把远程主机的文件系统映射到本地的目录中(转载)