前面的话

父组件使用props传递数据给子组件,子组件怎么跟父组件通信呢?这时,Vue的自定义事件就派上用场了。本文将详细介绍Vue自定义事件
事件绑定
每个 Vue 实例都实现了事件接口 (Events interface),即
使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件
[注意]Vue 的事件系统分离自浏览器的EventTarget API。尽管它们的运行类似,但是 $on 和 $emit 不是addEventListener 和 dispatchEvent 的别名
另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件
[注意]不能用 $on 侦听子组件抛出的事件,而必须在模板里直接用 v-on 绑定
<div id="example"> <parent></parent> </div>
<script>
var childNode = {
template: `<button @click="incrementCounter">{{ counter }}</button>`,
data(){
return {
counter: 0
}
},
methods:{
incrementCounter(){
this.counter ++;
this.$emit('increment');
}
},
}
var parentNode = {
template: `
<div class="parent">
<p>{{total}}</p>
<child @increment="incrementTotal"></child>
<child @increment="incrementTotal"></child>
</div>
`,
components: {
'child': childNode
},
data(){
return {
'total':0
}
},
methods:{
incrementTotal(){
this.total ++;
}
}
};
// 创建根实例
new Vue({
el: '#example',
components: {
'parent': parentNode
}
})
</script>
命名约定
自定义事件的命名约定与组件注册及props的命名约定都不相同,由于自定义事件实质上也是属于HTML的属性,所以其在HTML模板中,最好使用中划线形式
<child @pass-data="getData"></child>
而子组件中触发事件时,同样使用中划线形式
this.$emit('pass-data',this.childMsg)
数据传递
子组件通过$emit可以触发事件,第一个参数为要触发的事件,第二个事件为要传递的数据
this.$emit('pass-data',this.childMsg)
父组件通过$on监听事件,事件处理函数的参数则为接收的数据
getData(value){
this.msg = value;
}
<div id="example"> <parent></parent> </div>
<script>
var childNode = {
template: `
<div class="child">
<div>
<span>子组件数据</span>
<input v-model="childMsg" @input="data">
</div>
<p>{{childMsg}}</p>
</div>
`,
data(){
return{
childMsg:''
}
},
methods:{
data(){
this.$emit('pass-data',this.childMsg)
}
}
}
var parentNode = {
template: `
<div class="parent">
<div>
<span>父组件数据</span>
<input v-model="msg">
</div>
<p>{{msg}}</p>
<child @pass-data="getData"></child>
</div>
`,
components: {
'child': childNode
},
data(){
return {
'msg':'match'
}
},
methods:{
getData(value){
this.msg = value;
}
}
};
// 创建根实例
new Vue({
el: '#example',
components: {
'parent': parentNode
}
})
</script>
sync修饰符
在一些情况下,可能会需要对一个 prop 进行双向绑定。事实上,这正是Vue1.x中的 .sync修饰符所提供的功能。当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定的值。这很方便,但也会导致问题,因为它破坏了单向数据流的假设。由于子组件改变 prop 的代码和普通的状态改动代码毫无区别,当光看子组件的代码时,完全不知道它何时悄悄地改变了父组件的状态。这在 debug 复杂结构的应用时会带来很高的维护成本,上面所说的正是在 2.0 中移除 .sync 的理由
从 2.3.0 起重新引入了 .sync 修饰符,但是这次它只是作为一个编译时的语法糖存在。它会被扩展为一个自动更新父组件属性的 v-on 侦听器
<comp :foo.sync="bar"></comp>
会被扩展为:
<comp :foo="bar" @update:foo="val => bar = val"></comp>
当子组件需要更新 foo 的值时,它需要显式地触发一个更新事件:
this.$emit('update:foo', newValue)
因此,可以使用.sync来简化自定义事件的操作,实现子组件向父组件的数据传递
<div id="example">
<parent></parent>
</div>
<script src="https://unpkg.com/vue"></script>
<script>
var childNode = {
template: `
<div class="child">
<div>子组件数据:{{childMsg}}</div>
<input v-model="childMsg">
<button @click=add >+1</button>
</div>
`,
data(){
return{
childMsg: 0
}
},
methods:{
add(){
this.childMsg++;
this.$emit('update:foo',this.childMsg);
}
}
};
var parentNode = {
template: `
<div class="parent">
<p>父组件数据:{{msg}}</p>
<child :foo.sync="msg"></child>
</div>
`,
components: {
'child': childNode
},
data(){
return {
'msg':0
}
}
};
// 创建根实例
new Vue({
el: '#example',
components: {
'parent': parentNode
}
})
</script>
以上这篇Vue自定义事件(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# vue自定义事件
# node.js中事件触发器events的使用方法实例分析
# VUE DOM加载后执行自定义事件的方法
# vue子组件使用自定义事件向父组件传递数据
# 浅谈Vue.js 组件中的v-on绑定自定义事件理解
# Vue.js自定义事件的表单输入组件方法
# Vue.js组件通信之自定义事件详解
# Vue组件之自定义事件的功能图解
# vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
# 从Node.js事件触发器到Vue自定义事件的深入讲解
# 自定义
# 绑定
# 也会
# 给大家
# 修饰符
# 改变了
# 是在
# 都不
# 第一个
# 很高
# 希望能
# 第二个
# 作为一个
# 详细介绍
# 因为它
# 可以使用
# 以其
# 这篇
# 这在
# 不能用
相关文章:
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
建站之星后台密码遗忘?如何快速找回?
如何快速搭建高效简练网站?
建站VPS能否同时实现高效与安全翻墙?
公司网站的制作公司,企业网站制作基本流程有哪些?
免费视频制作网站,更新又快又好的免费电影网站?
如何配置IIS站点权限与局域网访问?
制作门户网站的参考文献在哪,小说网站怎么建立?
制作销售网站教学视频,销售网站有哪些?
Python多线程使用规范_线程安全解析【教程】
宝塔建站无法访问?如何排查配置与端口问题?
行程制作网站有哪些,第三方机票电子行程单怎么开?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
自助网站制作软件,个人如何自助建网站?
建站之星logo尺寸如何设置最合适?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何快速搭建高效WAP手机网站吸引移动用户?
如何选择建站程序?包含哪些必备功能与类型?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
高性价比服务器租赁——企业级配置与24小时运维服务
建站之星备案流程有哪些注意事项?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
寿县云建站:智能SEO优化与多行业模板快速上线指南
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何在IIS管理器中快速创建并配置网站?
建站主机是否等同于虚拟主机?
如何选择适配移动端的WAP自助建站平台?
如何用虚拟主机快速搭建网站?详细步骤解析
如何在IIS7上新建站点并设置安全权限?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何用花生壳三步快速搭建专属网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
建站之星各版本价格是多少?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何解决ASP生成WAP建站中文乱码问题?
Android自定义listview布局实现上拉加载下拉刷新功能
济南专业网站制作公司,济南信息工程学校怎么样?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
常州企业建站如何选择最佳模板?
如何快速搭建高效香港服务器网站?
建站ABC备案流程中有哪些关键注意事项?
图册素材网站设计制作软件,图册的导出方式有几种?
如何快速生成ASP一键建站模板并优化安全性?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
用v-html解决Vue.js渲染中html标签不被解析的问题
淘宝制作网站有哪些,淘宝网官网主页?
建站主机选哪家性价比最高?
*请认真填写需求信息,我们会在24小时内与您取得联系。