自定义事件

父组件使用 prop 传递数据给子组件。但子组件怎么跟父组件通信呢?这个时候 Vue 的自定义事件系统就派得上用场了。

1. 使用 v-on 绑定自定义事件

每个vue实例都实现了事件接口,即:

  1. 使用 $on(eventName)  监听事件
  2. 使用 $emit(eventName, optionPayload) 触发事件

注意点: 父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件

<div id="example">
{{msg}}
<h1>this is father component</h1>
<span>{{"儿子发来的数据:"+msgFromSon}}</span>
<son @tofather='receiveMsg'></son>
<!-- 2. 使用 $on(eventName) 监听事件:父组件使用v-on 来接收监听子组件触发的事件 -->
</div>
<script> Vue.component('son', {
template: `<div> <h1>This is son component</h1>
<input type="text" v-model="kw"/>
<button @click="handleClick">sendToFather</button>
</div>`,
data(){
return {
kw:''
}
},
methods:{
handleClick(){
console.log(this.kw);
this.$emit('tofather', this.kw);
//1. $emit(eventName)触发事件,还可以发送数据kw到父组件
}
}
})
new Vue({
el: '#example',
data: {
msg: 'Hello Directive',
msgFromSon:''
},
methods: {
receiveMsg(msg) { //3. 接收从子组件传递过来的数据
console.log('msg',msg);
this.msgFromSon += ' '+msg;
} }
})
</script>

2. 给组件绑定原生事件

有时候,你可能想在某个组件的根元素上监听一个原生事件。可以使用 v-on 的修饰符 .native。例如:

3.使用自定义事件的表单输入组件

自定义事件可以用来创建自定义的表单输入组件,使用v-model来进行数据双向绑定。注意:

所以在组件中使用时,它相当于下面的简写:

所以要让组件的v-model生效,它应该:

  1. 接受一个 value 的prop
  2. 在有新的值时触发 input 事件并将新值作为参数
          Vue.component('currency-input', {
template: `<span>$
<input ref='input' :value='value'
@input='updateValue($event.target.value)'>
</span>`,
props: ['value'], // 1. 接受一个value的props
methods: {
updateValue(value){
// 删除两侧的空格符,保留2位小数,这个例子还是比较初级的。比如,用户输入多个小数点或句号也是允许的
var formattedValue = value.trim().slice(0, value.indexOf('.') === -1
? value.length : value.indexOf('.') + 3);
// 如果值尚不合规,则手动覆盖为合规的值
if (formattedValue !== value) {
this.$refs.input.value = formattedValue;
}
this.$emit('input', Number(formattedValue)); // 2. 触发input事件到父组件;
} }
})
new Vue({
el: '#app',
data() {
return {
price: ''
}
}
})

4. 自定义组件的 v-model

默认情况下,一个组件的v-model会使用 value prop和 input 事件。但如单选框,复选框之类的输入类型可能会把 value 用作它用。model 选项可以避免这样的冲突:

注意你仍然需要显式声明 checked 这个 prop。

5. 非父子组件的通信

有时候,非父子关系的两个组件之间也需要通信。在简单的场景下,可以使用一个空的 Vue 实例作为事件总线:

页面如下:

<div id="example">
<laoda></laoda>
<hr/>
<laoer></laoer>
</div> <script type="text/x-template" id="laoda-template">
<div>
<h1>laoda</h1>
<button @click="tellLaoer">回家吃饭</button>
</div>
</script>
<script type="text/x-template" id="laoer-template">
<div>
<h1>laoer</h1>
<span v-if="msgFromLaoDa">{{"老大说:"+msgFromLaoDa}}</span>
</div>
</script>

JS如下:

    //新建一个Vue的实例,通过bus完成事件的绑定和触发
var bus = new Vue(); Vue.component('laoda', {
template: '#laoda-template',
methods:{
tellLaoer: function () { //1. 触发事件通知老二回家吃饭
bus.$emit('eventToBrother','赶紧回家吃饭')
}
}
})
Vue.component('laoer', {
template: '#laoer-template',
data:function(){
return {
msgFromLaoDa:null
}
},
mounted: function () {
console.log(this, bus); // 3.外面的this指向laoer这个组件
// 2. 事件的绑定
bus.$on('eventToBrother', function (result) {
console.log('this:', this); // 4. 里面的this原指向bus,使用bind后,就指向了组件
this.msgFromLaoDa = result;
}.bind(this));
}
}) new Vue({
el: '#example',
data: {
msg: 'Hello Directive'
}
})

vue学习之组件(component)(二)的更多相关文章

  1. vue学习之组件(component)(一)

    组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下, ...

  2. Vue学习之组件切换及父子组件小结(八)

    一.组件切换: 1.v-if与v-else方式: <!DOCTYPE html> <html lang="en"> <head> <met ...

  3. vue学习之四组件系统

    vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能.本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统. 一.Vue.js组件系统 每一个 ...

  4. Vue教程:组件Component详解(六)

    一.什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功 ...

  5. Vue学习之--------组件的基本使用(非单文件组件)(代码实现)(2022/7/22)

    文章目录 1.为啥要使用组件 2.基本使用 3.代码实例 4.测试效果 5.注意点 1.为啥要使用组件 好用啊.像堆积木一样 2.基本使用 Vue中使用组件的三大步骤: 一.定义组件(创建组件) 二. ...

  6. vue学习之组件

    组件从注册方式分为全局组件和局部组件. 从功能类型又可以分为偏视图表现的(presentational)和偏逻辑的(动态生成dom),推荐在前者中使用模板,在后者中使用 JSX 或渲染函数动态生成组件 ...

  7. Vue学习之--------组件嵌套以及VueComponent的讲解(代码实现)(2022/7/23)

    欢迎加入刚建立的社区:http://t.csdn.cn/Q52km 加入社区的好处: 1.专栏更加明确.便于学习 2.覆盖的知识点更多.便于发散学习 3.大家共同学习进步 3.不定时的发现金红包(不多 ...

  8. 后端开发者的Vue学习之路(二)

    目录 上篇内容回顾: 数据绑定 表单输入框绑定 单行文本输入框 多行文本输入框 复选框checkbox 单选框radio 选择框select 数据绑定的修饰符 .lazy .number .trim ...

  9. 40.VUE学习之--组件之间的数据传参父组件向子组件里传参,props的使用实例操作

    父组件向子组件里传参,props的使用实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

随机推荐

  1. 安装office2019

    win10系统安装office2019 安装文件下载 https://pan.baidu.com/s/1VnqJ-hNwysPKBhdzE3FSww#list/path=%2F&parentP ...

  2. Sql Server 2005主机和镜像切换SQL语句

    --1.主备互换 --主机执行: USE master; ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --2.主服务器Down掉 ...

  3. git的三个区域比较

    工作区: 暂存区: 提交区: 工作区与暂存区比较:git diff 工作区与提交区比较:git diff 提交hash码或者HEAD 暂存区与提交区比较:git diff --cached 两个不同提 ...

  4. 原生js实现头像大屏随机显示

    效果如下图所示: 一.html部分 <div class="myContainer"> <ul> <li class="first" ...

  5. MySql存储过程批量给多个数据库中的同名表添加字段

    1 创建存储过程 batchAddField:给所有"MyDB_"开头的数据库添加新字段 -- ---------------------------- -- Procedure ...

  6. TZOJ 1503 Incredible Cows(折半搜索+二分)

    描述 Farmer John is well known for his great cows. Recently, the cows have decided to participate in t ...

  7. 四种基本组合博弈POJ1067/HDU1846

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43466   Accepted: 14760 Descripti ...

  8. Javascript-循环输出菱形,并可菱形自定义大小

    var Cen = 6;//定义菱形中部为第几行(起始值为0) //for循环输出菱形 document.write("<button onclick='xh()'>点我for循 ...

  9. 实战课堂 | DMS企业版教你用一条SQL搞定跨实例查询

    背景 数据管理DMS企业版提供了安全.高效地管理大规模数据库的服务.面对多元的数据库实例,为了更方便地查询被“散落”在各个地方的业务数据,我们在DMS企业版中提供了跨数据库实例查询服务. 什么是跨实例 ...

  10. 基于MaxCompute打造轻盈的人人车移动端数据平台

    摘要: 2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,人人车大数据平台负责人吴水永从人人车 ...