Vue 进阶之路(十)
之前的文章介绍了 vue 的组件化,本章我们来看一下 vue 中组件的原生事件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
<child @click="handleFatherClick"></child>
</div>
<script>
Vue.component("child", {
template: `
<p>child</p>
`
});
var app = new Vue({
el: '#app',
methods: {
handleFatherClick() {
console.log("father click")
}
}
})
</script>
</body>
</html>
如上图代码,我们在子组件 child 上绑定了一个 click 事件,并在父组件的 methods 中打印输出日志,结果在控制台并没有打印出我们想要的东西。这是由于现在的 click 事件是一个自定义的事件,并不是原生的 click 事件,这样的写法我们在父子组件间传值时使用过,如下代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
<child @click="handleFatherClick"></child>
</div>
<script>
Vue.component("child", {
methods: {
handleChildClick(){
console.log("child click")
}
},
template: `
<p @click="handleChildClick">child</p>
`
});
var app = new Vue({
el: '#app',
methods: {
handleFatherClick(){
console.log("father click")
}
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
<child @click="handleFatherClick"></child>
</div>
<script>
Vue.component("child", {
methods: {
handleChildClick() {
console.log("child click");
this.$emit('click');
}
},
template: `
<p @click="handleChildClick">child</p>
`
});
var app = new Vue({
el: '#app',
methods: {
handleFatherClick() {
console.log("father click")
}
}
})
</script>
</body>
</html>
在父子组件传值的文章中我们是通过 $emit 触发一个自定义事件,然后通过该自定义事件绑定在父组件的 methods 属性的方法上来传值的。在上面的代码中我们在子组件的 p 标签上绑定了一个 click 事件,该事件为原生事件,我们通过该事件的 handleChildClick() 方法,并通过 $emit 向外触发了一个 click 的事件,在 <child> 标签中,我们再通过父组件方法中的 handleFatherClick() 方法来绑定此触发事件,这样就可以运行父组件的 handleFatherClick() 事件了,如下结果:

当我们点击页面上的 child 时,根据日志输出可以看出:先触发子组件的原生 click 事件,然后通过子组件自定义的 click 事件向外触发的方式触发了父组件的 click 事件。
但是如果这样写看起来十分麻烦,那我们可不可以不通过子组件的自定义事件来触发父组件的 click 原生事件呢,Vue 官方为我恩提供了 native 原生事件方法,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
<child @click.native="handleFatherClick"></child>
</div>
<script>
Vue.component("child", {
template: `
<p>child</p>
`
});
var app = new Vue({
el: '#app',
methods: {
handleFatherClick() {
console.log("father click")
}
}
})
</script>
</body>
</html>
我们不通过子组件向外触发事件,而是直接在 <child> 标签上的 click 方法上加了 .native 属性,它的意思是触发父组件原生的 click 事件,这样就能达到和上面一样的效果。如下:

Vue 进阶之路(十)的更多相关文章
- Vue 进阶之路(九)
之前的文章我们介绍了 vue 中父组件之间的传值,本章我们再来看一下父子组件间传值的参数校验和非 Props 特性. <!DOCTYPE html> <html lang=" ...
- Vue 进阶之路(八)
之前的文章我们对组件 component 进行了简单的介绍,本章我们将深入了解一下组件,并实现父子组件间的传值. <!DOCTYPE html> <html lang="e ...
- Vue 进阶之路(七)
之前的文章我们对 vue 的列表输出做了介绍,本章我们来看一下 vue 的组件 component. <!DOCTYPE html> <html lang="en" ...
- Vue 进阶之路(六)
上篇文章我们分析了一下 vue 中的条件渲染,本篇我们说一下 vue 中的列表渲染和 set 方法. <!DOCTYPE html> <html lang="en" ...
- Vue 进阶之路(五)
之前的文章我们说了一下 vue 的样式绑定,这篇文章来介绍一下 vue 中的条件渲染,先看下面的代码: <!DOCTYPE html> <html lang="en&quo ...
- Vue 进阶之路(四)
之前的文章我们已经对 vue 有了初步认识,这篇文章我们通过一个例子说一下 vue 的样式绑定. 现在我们想要是想这样一个需求,页面上有个单词,当我们点击它的时候颜色变为红色,再点击一次变为原来的颜色 ...
- Vue 进阶之路(三)
之前的文章我们已经对 vue 有了初步认识,这篇文章我们通过一个例子说一下 vue 的方法 methods,计算属性 computed 和监听器 watch. 现在我们有一个需求,变量 firstNa ...
- Vue 进阶之路(二)
之前的文章我们初识了 vue,对其原理,数据绑定和方法进行了简单的演示,本篇将对 vue 插值表达式,v-text,v-html 进行讲解. <!DOCTYPE html> <htm ...
- Vue 进阶之路(一)
vue 3.x 马上就要问世了,显然尤大大是不想让我们好好活了,但是转念一想,比你优秀的人都还在努力,那我们努力还有什么用,开个玩笑而已,本人对于 vue 的接触时间不长,对其也没有深入地去研究源码, ...
随机推荐
- iPhone iPad 各种控件默认高度
iPhone和iPad下各种常见控件的宽度和标准是一样的,所以这里就用iPhone说明. 以下是常见的几种控件的高度.Statusbar,Navigationbar和Tabbar的宽度极其图标大小. ...
- C#控制台自定义背景颜色,字体颜色大全
效果: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- Golang之(if)流程控制
(if)我能坚持做好一只地鼠,慢慢的刨坑,讲洞挖的深一点…… package main import ( "fmt" ) func testIf1() { num := //var ...
- macos修改vmware Fusion的NAT网络
https://blog.csdn.net/zhishengqianjun/article/details/77046796 http://pubs.vmware.com/fusion-5/index ...
- PAT 1084 外观数列(20)(代码+思路+推荐测试用例)
1084 外观数列(20 分) 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 ...
- HDU 4499.Cannon 搜索
Cannon Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- [SoapUI] 设置最大等待时间,不断重复的去发送一个request,每次从response中获取一个status,直到这个status从一种状态变成另外一种状态
import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def holde ...
- 【Linux】MySQL配置
安装环境/工具 Linux( centOS 版) MySQL(MySQL-5.6.28-1.el7.x86_64.rpm-bundle.tar版) MySQL的目录结构 安装已经说过了,这里不再说了 ...
- java利用递归实现汉诺塔算法
package 汉诺塔; //引入Scanner包,用于用户输入 import java.util.Scanner; public class 汉诺塔算法 { public static void m ...
- 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...