Vue自定义事件
前面的话
父组件使用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>
下面示例中,修改子组件中的input值,则父组件到接收到相同值,则显示出来
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自定义事件的更多相关文章
- (尚031)Vue_案例_自定义事件(组件间通信第2种方式:vue自定义事件)
自定义事件: 我们知道,父组件使用prop传递数据的子组件,但子组件怎么跟父组件通信呢? 这个时候Vue的自定义事件系统就派得上用场了. 自定义事件知道两件事: (1).绑定 (2).触发 注意:$o ...
- Vue04——vue自定义事件、Router、Vue-cli、发布上线
一.Vue的自定义事件 点击任何一个按钮,按钮本身计数累加,但是每点击三个按钮中的一个,totalCounter 都要累加. <body> <div id="app&quo ...
- Vue自定义事件,$on(eventName) 监听事件,$emit(eventName) 触发事件
<!--自定义事件 使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件--> <div id="app15"> ...
- vue自定义事件 子组件把数据传出去
每个 Vue 实例都实现了事件接口(Events interface),即: 使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件 1.使用v-on绑定自定义 ...
- 关于vue自定义事件中,传递参数的一点理解
例如有如下场景 先熟悉一下Vue事件处理 <!-- 父组件 --> <template> <div> <!--我们想在这个dealName的方法中传递额外参数 ...
- Vue 自定义事件 && 组件通信
1 App.vue 2 <template> 3 <!-- 4 组件的自定义事件: 5 1.一种组件间通信的方式,使用于:子组件===>父组件 6 2.使用场景:A是父组件,B ...
- vue自定义事件---拖拽
margin布局拖拽 Vue.directive('drag', { bind(el, binding, vnode, oldVnode) { const dialogHeaderEl = el.qu ...
- Vue自定义事件:触发自定义事件
一 项目结构 二 子组件(Mongo.vue) <template> <button @click="eat">按钮</button> < ...
- vue 自定义事件
随机推荐
- 集成 ssh第一阶段
1.添加spring支持,包含spring-hibernate和spring-struts2.添加struts支持,包含struts-spring3.添加hibernate支持,在spring配置文件 ...
- readSerializableObj
package JBJADV003;import java.io.*;public class readSerializableObj { public static void main(String ...
- VBS基本语法
一.初识VBS Vbs 是一种变量无关.解释性执行的脚本语言.vbs语言中不区分大小写.语句以换行结束. dim 声明变量:批量名称声明,多个变量之间用逗号分隔: set ...
- PHP基础知识1
Php的变量和基本语法 1.变量/常量 2.Php数据类型和基本语法 基本语法 1. html和php混编 2. 一个语句以:(分号)结束 3. 如何定义一个变量.和变量的使用 4. ...
- Java虚拟机:JVM内存分代策略
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存 ...
- ArrayList和LinkedList源码
1 ArrayList 1.1 父类 java.lang.Object 继承者 java.util.AbstractCollection<E> 继承者 java.util.Abstract ...
- java内存区域——深入理解JVM读书笔记
本内容由<深入理解java虚拟机>的部分读书笔记整理而成,本读者计划连载. 通过如下图和文字介绍来了解几个运行时数据区的概念. 方法区:它是各个线程共享的区域,用于内存已被VM加载的类信息 ...
- 浅谈 EF CORE 迁移和实例化的几种方式
出于学习和测试的简单需要,使用 Console 来作为 EF CORE 的承载程序是最合适不过的.今天笔者就将平时的几种使用方式总结成文,以供参考,同时也是给本人一个温故知新的机会.因为没有一个完整的 ...
- 大数据与Java的关系
随着2017年大数据各种应用的发展,大数据的价值得以充分的发挥,大数据已在企业.社会各个层面都成为重要的手段,数据已成为新的企业战略制高点,也是各个企业争夺的新焦点.那么我们一直在说着的大数据究竟是什 ...
- iOS TextField输入限制(限制长度、只能输入数字,只能输入数字字母……)
项目中各个地方都会用到TextField,textField的输入也会有各种需求,各种限制,每次用到的时候要重写一遍这些限制,导致各种垃圾代码,各种重复,有一天,我终于看不下去了,于是把textFie ...