目录
this.$emit('事件名',....) 这里一般是json对象
事件监听可以使用v-on 指令
1.事件修饰符
Vue通过由点(.)表示的指令后缀来调用修饰符,
.stop
.prevent
.capture
.self
.once
...
...
注1:什么是事件冒泡?
也就是可以这样理解为:当我点击div就会弹出div,传播到body,在到document
解决方法:阻止冒泡
html> <html> <head> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script> <meta charset="utf-8"> <title>title> <style type="text/css"> .red{ height: 400px; width: 400px; background-color: red; } .yellow{ height: 300px; width: 300px; background-color: yellow; } .blue{ height: 200px; width: 200px; background-color: blue; } .green{ height: 100px; width: 100px; background-color: green; } style> head> <body> <div id="app"> {{msg}} <div class="red" @click="red"> <div class="yellow" @click.stop="yellow"> <div class="blue" @click="blue"> <div class="green" @click.stop="green">div> div> div> div> div> body> <script type="text/javascript"> // 创建实例 new Vue({ // 挂载实例 el:'#app', // 变量区 data() { return { msg:'hello vue!!!' } }, methods:{ red(){ alert('red'); }, yellow(){ alert('yellow'); }, blue(){ alert('blue'); }, green(){ alert('green'); } } }) script> html>就不会传播了
为了防止有些人,一直点击发送按钮,有可能是因为它的网络慢,或者其他,它就一直在哪里点,每点击一次就会像后台发送一次请求
演示:
解决方法:
html> <html> <head> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script> <meta charset="utf-8"> <title>title> head> <body> <div id="app"> <p>发送一次p> <input type="text" v-model="msg" /> <button v-on:click.once="dianwoshishi">点我试试button> div> body> <script type="text/javascript"> // 创建实例 new Vue({ // 挂载实例 el:'#app', // 变量区 data() { return { msg:'hello vue!!!' } }, methods:{ dianwoshishi(){ console.log(this.msg); } } }) script> html>运行结果:
Vue允许为v-on在监听键盘事件时添加按键修饰符:
Vue为最常用的按键提供了别名
enter = 13 它们两是同一个意思 回车键
全部的按键别名:
.enter
.tab
.delete (捕获 "删除" 和 "退格" 键)
.esc
.space
.up
.down
.left
.right
.ctrl
.alt
.shift
.meta
- html>
- <html>
- <head>
-
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
-
- <div id="app">
- <p>按键修饰符p>
- <input type="text" v-model="msg" @keyup.enter="dianwoshishi"/>
- div>
- body>
- <script type="text/javascript">
- // 创建实例
- new Vue({
- // 挂载实例
- el:'#app',
- // 变量区
- data() {
- return {
- msg:'hello vue!!!'
- }
- },
- methods:{
- dianwoshishi(){
- alert(this.msg)
- // console.log(this.msg);
- }
- }
- })
- script>
- html>
运行结果如图所示:

如果是前端框架,这个自定义组件是要深入的去了解
vue组件
1 组件简介
组件(Component)是Vue最强大的功能之一
组件可以扩展HTML元素,封装可重用的代码
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树
2 全局和局部组件
全局组件:Vue.component(tagName, options),tagName为组件名,options为配置选项。
局部组件: new Vue({el:'#d1',components:{...}})
注册后,我们可以使用以下方式来调用组件:
3 props
props是父组件用来传递数据的一个自定义属性。
父组件的数据需要通过props把数据传给子组件,子组件需要显式地用props选项声明 "prop"
注1:因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods
以及生命周期钩子等。仅有的例外是像el这样根实例特有的选项。
注2:当我们定义这个
组件时,你可能会发现它的data并不是像这样直接提供一个对象 data: {
count: 0
}
取而代之的是,一个组件的data选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝:
data: function () {
return {
count: 0
}
}
注3:定义组件名的方式有两种
短横线分隔命名(建议使用)
Vue.component('my-component-name', { /* ... */ }),引用方式:
首字母大写命名
Vue.component('MyComponentName', { /* ... */ }),引用方式:
和 都是可接受的 注4:HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时,
camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名:
props: ['postTitle'],
注5:props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
希望每个 prop 都有指定的值类型
props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object,
callback: Function,
contactsPromise: Promise // or any other constructor
- html>
- <html>
- <head>
-
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <div id="app">
- <p>简单组件p>
- <my-button>my-button>
- <p>父组件 传参 给 子组件p>
-
- <my-button m='zhangsan' n='3'>my-button>
- div>
- body>
- <script type="text/javascript">
- // component有两个参数,一是:自定义组件名称,二是:模板
- Vue.component('my-button',{
- // template:'',
- template:'',
- props:['m','n']
- })
- new Vue({
- el:'#app',
- data() {
- return {
- msg:'hello vue!!'
- }
- }
- })
- script>
- html>
运行结果如图所示:
自定义事件
监听事件:$on(eventName)
触发事件:$emit(eventName)
注1:Vue自定义事件是为组件间通信设计
vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定
父Vue实例->Vue实例,通过prop传递数据
子Vue实例->父Vue实例,通过事件传递数据
注2:事件名
不同于组件和prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称
建议使用“短横线分隔命名”,例如:three-click
子组件 将参数 传递给 父组件 的关键在于下面这两个,要满足下面的两个条件
1.$emit 2.自定义事件this.$emit('事件名',{})
代码块:
- html>
- <html>
- <head>
-
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <div id="app">
- <p>子传父p>
- <my-button m="zhangsan" n="3" @mymethod="xxx">my-button>
- div>
- body>
- <script type="text/javascript">
- // 内部组件
- Vue.component('my-button',{
- template:'',
- props:['m','n'],
- methods:{
- sub(){
- var name = "张三";
- var sex = "男";
- var age = 22;
- console.log(name);
- console.log(sex);
- console.log(age);
- // 子组件 将参数 传递给 父组件 的关键在于
- // 1.$emit 2.自定义事件
- this.$emit('mymethod',name,sex,age);
- }
- }
- })
-
- // 外部组件
- new Vue({
- el:"#app",
- data() {
- return {
- msg:'hello vue!!!'
- }
- },
- methods:{
- xxx(a,b,c){
- console.log(a);
- console.log(b);
- console.log(c);
- }
- }
-
- })
-
- script>
- html>

定义:template
父传子:props
子传父:通过$emit注册事件名
this.$emit('事件名',....) 这里一般是json对象
- html>
- <html>
- <head>
-
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <div id="app">
-
- 姓名:<input type="text" v-model="uname"/><br>
- 密码:<input type="password" v-model="pwd"/><br>
- 年龄:<input type="text" v-model="age"/><br>
- 性别:<input type="radio" name="sex" checked="checked"/>男
- <input type="radio" name="sex"/>女<br>
- 爱好:
- <div v-for="l in likes">
- <input v-model="hobby" type="checkbox" :value="l.id"/>{{l.name}}
- div><br>
- 英语等级:
- <select v-model="selectedVal">
- <option v-for="e in englishs" :value="e.id">{{e.name}}option>
- select><br>
- <input @click="show" type="checkbox" />
- <input v-show="showFlag" @click="sub" type="button" value="ok" />
- <div>div>
- div>
- body>
- <script type="text/javascript">
- new Vue({
- el:'#app',
- data() {
- return {
- uname:null,
- pwd:null,
- age:null,
- sex:1,
- likes:[ //爱好的数据源
- {id:1,name:'篮球'},
- {id:2,name:'足球'},
- {id:3,name:'桌球'},
- {id:4,name:'乒乓球'}
- ],
- englishs:[ //英语的数据源 下拉框
- {id:1,name:'优'},
- {id:2,name:'良'},
- {id:3,name:'差'}
- ],
- hobby:[],//用来存放选中的爱好 比如1,3
- selectedVal:0,
- showFlag:false
- }
- },
- methods:{
- show() {
- this.showFlag = true;
- },
- sub(){
- // 后续都是json数据交互,向后台提交json对象
- var obj = {
- uname:this.uname,
- pwd:this.pwd,
- age:this.age,
- sex:this.sex,
- hobby:this.hobby,
- level:this.selectedVal
- }
- console.log(obj);
- }
- }
- })
- script>
- html>
运行结果如图所示:

阻止冒泡和只能发送一次还有按键的修饰符等等
阻止冒泡就是为了传播,当点击最外面一层,就不会传播,点击最里面的就会传播到最外面停止,
就好像河里的水,当你去点击水面的时候,它就会从内传播到外,直到停止。
发送一次指的的就是,只能向服务发送一次请求,这样就可以减少服务的压力,为了防止某人手不安分,它没反应就一直在哪里狂点。
按键修饰符指的就是键盘的按键事件,就是不需要鼠标点击,直接用键盘回应,就好比如我们登陆,我们每登陆一个账号都会有一个确定或者注册等等,我们就可以用按键的修饰符来完成,我们就用回车键就可以直接进去登陆,不需要用鼠标移到来点击那个按钮。
通过component里面有两个参数,一定组件名字,二是模板
Vue.component('定义的组件名称',{
模板:template:[标签]
})
是要通过在模板里面写 props:['','',...] 这里面就是你父标签里面的参数,有多少放多少
子组件 将参数 传递给父组件要满足两个条件,一是$emit ,二是自定义事件
this.$emit('自定义事件',参数)