VUE中 $on, $emit, v-on三者关系
VUE中 $on, $emit, v-on三者关系
每个vue实例都实现了事件借口
- 使用$on(eventName)监听事件
- 使用$emit(eventName)触发事件
若把vue看成家庭(相当于一个单独的components),女主人一直在家里派($emit)男人做事,而男人一直监听$on着女主人的指派($emit)里eventName所触发的事件消息,一旦$emit事件一触发,$on则监听$emit所派发的事件,派发的命令和执行所要做的事都是一一对应的
Vm.$emit(event,[...args])
参数 {String}event
[...args]
触发当前实例上的事件,附加参数都会传给监听器回调
Vm.$on(evnet,callback)
参数 {String | Array<String>}event
{function}callback
监听当前实例上的自定义事件,事件可以由Vm.$emit触发,回调函数会接受所有传入事件触发函数的额外参数
第二个参数则是一个function,同样也被叫做之前回调函数,里面可以接受到$emit触发时所传入的参数
<template>
<div>
<p @click="emit">{{msg}}</p>
</div>
</template>
<script>
export default {
data(){
return {
msg:'点击后女人派发事件'
}
},
create(){
//派发wash_foods事件
this.$on('wash_foods',arg=>{
console.log(arg);
})
},
methods:{
emit(){
//触发 wash_foods 事件
this.$emit('wash_foods',['fish','potato','fruit'])
}
}
}
</script>
当女人派发的事情多了,男人也会觉得很烦,听到事件后,总会抱怨几句,若女人在组成家庭之前,告诉男人将要监听哪些事情,如果做一件抱怨一次,岂不是多此一举,所以通过Array<String>event 把事件名写成一个数组,在数组里写入所要监听的事件
<template>
<div>
<p @click="emit">{{msg}}</p>
<p @click="emitOther">{{msg2}}</p>
</div>
</template>
<script>
export default {
data(){
return {
msg:"点击后女人派发事件",
msg2:"点击后女人派发事件2"
}
},
create(){
this.$on(['wash_foods','driver_car'],arg=>{
console.log('事真多'); });
this.$on('wash_foods',arg=>{
console.log(arg)
});
this.$on('ariver_car',arg=>{
console.log(arg)
})
},
methods:{
emit(){
this.$emit('wash_foods','fish')
},
emitOther(){
this.$emit('driver_car',['audi','BWM'])
}
}
}
</script>
通常在写组件的时候,让 $emit在父级作用域中进行一个触发,通知子组件 进行执行事情
自定义事件可以用来创建自定义的表单输入组件
使用v-mode来进行数据双向绑定
<input v-mode="sth"> //不过是以下事例的语法糖
<input v-bind:value="sth"
v-on:input="sth" = $event.target.value">
每当输入框内容发生变化的时候,就会触发input事件,然后把input输入框中的value值再次传递给sth,此时value运用在一个input元素上,用 v-bind:value="sth" 意义上面只是把一一对应的双向绑定,这就像一个循环操作,当再次触发input事件时,input($event.target)对象中的value值会再次改变sth
通过自定义事件让v-mode进行一个父子组件 双向绑定的花
- v-bind:value="sth" 此时value是作为子组件接受props
接受的只能是value,因为v-model是基于input输入框定制的,其中value值是input内部定制的
此时作用域在组件上时,v-on监听的语法糖也会有所改变,监听的并不是$event.target.value,而是回调函数的第一个参数
v-on:input = "sth = arguments[0]"
这是一个模态框的基本雏形,可以在父组件中通过v-model 来进行model框和父组件之间的显示交互,通过子组件看出通过props接受了value值; 当点关闭的时候还是通过$emit事件触发input事件,然后通过出入false参数
父组件隐式 v-on:input = "sth = arguments[0]"进行了监听,一旦input事件触发, 父组件就会进行监听回调,从而双向绑定
checkbox 和radio 原理
<input type="checkbox" :checked="status"
@change="status=$event.target.checked"/>
<input type="radio" :check="status"
@change="status=$event.target.checked"/>
通过绑定checked属性,同样的监听的是change事件,无论是checkbox还是radio在操作的时候都会隐式自动触发一个change事件,跟input通过value值input触发事件原理绑定是一样的
<!-- 父组件 -->
<template>
<div class="Father">
<button @click="show=true">打开model</button>
<Son v-model="show"></Son>
</div>
</template>
<script>
import Son from './Son'
export default {
name:"Father",
data(){
return{
show:false
}
},
components:{son}
}
</script> <!-- 子组件 -->
<template>
<div class="Son" v-show="value">
<div>
<p>model框</p>
<input type="text" v-model="value" />>
{{value}}
<button @click="close">关闭model</button>
</div>
</div>
</template> <script>
export default {
name:'Son',
props:['value'], //接受父组件传来的value值
methods:{
close(){//页面关闭子组件model框按钮事件
this.$emit('input',false)
}
}
}
</script>
定义组件v-model
定制组件,就可以重写v-model里的props和event
默认情况下一个组件的v-model会使用value 属性和input 事件,而value值被占用了,
或者表单和自定义v-model的$emit('input')事件发生冲突,为了避免这种冲突,可以定制组件v-model
input中的v-model和model显示操作数据共同占用props中的value,同样两者也共同占据了emit('input' )触发事件,input输入框的事件自动触发,而model显示消失是手动触发的
初始化的时候,input输入框的值会被value传入的false值给自动加上,当改变input输入框的时候,因为冲突而导致报错
定制v-model,通过model选项改变props和evnet的值,从而解除两者的冲突
- props代替掉原本value的值,可以自定义值
- event代表掉原来input的触发事件,可自定义触发事件
VUE中 $on, $emit, v-on三者关系的更多相关文章
- main.js index.html与app.vue三者关系详解
main.js index.html与app.vue三者关系详解 2019年01月23日 11:12:15 Pecodo 阅读数 186 main.js与index.html是nodejs的项目启 ...
- linux下bus,device,driver三者关系
linux下bus,device,driver三者关系 1.bus: 总线作为主机和外设的连接通道,有些总线是比较规范的,形成了很多协议.如 PCI,USB,1394,IIC等.任何设备都可以选择合适 ...
- 【转】Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Andr ...
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
转自:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Android中的 ...
- Feign Ribbon Hystrix 三者关系 | 史上最全, 深度解析
史上最全: Feign Ribbon Hystrix 三者关系 | 深度解析 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 疯狂创客圈(笔者尼恩创建的 ...
- Vue中利用$emit实现子组件向父组件通信
Vue中利用$emit实现子组件向父组件通信 父组件 <template> <div> <p>我是父组件</p> <child :isShow=& ...
- JS高级---构造函数,实例对象和原型对象,三者关系
构造函数,实例对象和原型对象,三者关系 构造函数里面有原型(prototype)属性,即原型对象 原型对象里的constryctor构造器指向构造函数 通过构造函数,实例化,创建的就是实例对象. 实例 ...
- antV G6流程图在Vue中的使用
最近我司项目中需要加入流程图制作功能,于是乎百度各种找可视化绘制拓扑图的轮子,大部分都是国外的,看文档太吃力,不过好在最终让我发现了AntV G6流程图图表库,最新版为2.0,不过编辑器在2.0版本还 ...
- 理解MVVM在react、vue中的使用
理解MVVM在react.vue中的使用 一:什么是MVC.为什么不用MVC 1:MVC的含义: M(modal):是应用程序中处理数据逻辑的部分. V (view) :是应用程序中数据显示的部分. ...
随机推荐
- JavaScript中的"奇奇怪怪"
filter等方法的隐式转化 var list = [1,,2,,0,5,9];console.log(list[1]); // console: undefinedconsole.log(list[ ...
- 深入探索Java设计模式(二)之策略模式
策略设计模式是Java API库中常见的模式之一.这与另一个设计模式(称为状态设计模式)非常相似.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题]中<学习源码中的优秀设计模式> ...
- Socket与系统调用深度分析
学习一下对Socket与系统调用的分析分析 一.介绍 我们都知道高级语言的网络编程最终的实现都是调用了系统的Socket API编程接口,在操作系统提供的socket系统接口之上可以建立不同端口之间的 ...
- 《Java基础知识》Java集合(Collection)
作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...
- 面试 3-5年Java开发后的感受
在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...
- Web基础了解版04-XML-Tomcat-Http
XML 什么是XML - Tomcat - Http XML:eXtensible Markup Language (可扩展标记语言). XML 是一种标记语言,很类似 HTML. XML 的设计宗旨 ...
- SpringBoot微服务电商项目开发实战 --- 分布式文件系统实现
SpringBoot分布式开发系列文章已经持续了一段时间了,每一篇都有核心内容讲给大家.比如:分环境部署配置及服务端口号统一配置,子模块版本号管理及第三方jar依赖管理,单点登录实现,接口安全(签名+ ...
- Glide只播放一次Gif以及监听播放完成的实现方案
需求: 近段时间正好有一个需求,是要实现Gif图只加载播放一次,并且要在Gif播放完毕后回调给系统的需求. 因为Glide 3系列的API与4系列还是有很大差距的,这里我们针对Glide 3.x和Gl ...
- AndroidStudio初识
大家好,欢迎来到下码看花,伟大领袖毛爷爷曾经说过:“ ‘走马看花不如驻马看花,驻马看花不如下马看花.’我希望你们都要下马看花.”,比喻停下来,深入实际,认真调查研究,这就是咱们公众号名字的由来.与君初 ...
- VNC连接CentOS7远程桌面
1.在centos7安装图形化 先安装图形用户接口X Window System,再安装GNOME桌面. [root@centos7 ~]# yum groupinstall -y "X W ...