vuejs使用$emit和$on进行组件之间的传值的示例


Posted in Javascript onOctober 04, 2017

$emit和$on可以实现组件之间的传值,我们知道父组件传值给子组件使用props,但是不允许子组件传值给父组件,这时候使用这个就可以实现了。

注意:$emit和$on的事件必须在一个公共的实例上,才能够触发。

例子:我要实现某个系统的通讯录功能,在web端我们可以使用基于jQuery的ztree插件实现目录的展现,但是在vuejs框架里面,tree目录需要通过递归组件实现。

1、现在有两个组件,父组件contact_index.vue,子组件cust_tree.vue

vuejs使用$emit和$on进行组件之间的传值的示例

2、点击父组件里面的选择银行,跳出银行树目录结构(使用vuejs的递归组件实现),这里面需要做两种传值:

(1)父组件通过props将树目录的数据list传到子组件中形成目录结构的展示;

(2)子组件里面通过点击相应的银行请求查询银行的通讯录,这里面需要将点击的银行的机构代码回传给父组件,父组件接收后通过input将机构代码提交给后台请求查询;

第一种是父组件给子组件传值使用props即可,现在我们来谈谈第二种情况,如何将子组件的值回传给父组件。

网上百度千篇一律全是使用$emit来实现,可是都有一个严重的误区没有给别人说明,开始我都按照搜索的结果进行操作,都会出现子组件$emit后父组件没有监听到函数的变化,研究了好久才发现$emit和$on的事件必须在一个公共的实例上,才能够触发。我的操作如下:

首先在src目录下新加bus.js作为一个公共的实例

import Vue from 'vue'

export var bus = new Vue()

其次,父组件在created里面定义$on监听事件

//父组件与子组件都要import bus.js
import {bus} from '../../bus.js'
created(){
  bus.$on('custTreeSay',(id)=>{
  //监听传值--机构代码
  this.instCode = id;
  //关闭弹窗
  this.popupVisibleTree = false;
  //调用查询方法刷新通讯录列表
  this.query();
  });
  bus.$on('custTreeSayName',(name)=>{
  //监听传值--机构名称
  this.instName = name;
  });
}

最后,在子组件中定义点击事件,调用父组件方法通过$emit将相应值传给父组件

<span @click="propInstCode(model);propInstName(model)">
 {{model.name}}
</span>
<script type="text/javascript">
 import {bus} from '../../bus.js'
 export default {
  props: ['model'],//这里通过props接收父组件的传值
  
  //method钩子定义传值方法,这边需要传不同的值
  methods: {
  //通过总线将值传给父组件
  propInstCode:function (model) {
  //$emit触发当前实例事件
  bus.$emit('custTreeSay',this.model.id);
  },
  propInstName:function (model) {
  bus.$emit('custTreeSayName',this.model.name);
  }
 },
 }

这样就实现了子组件能通过$emit将值传给bus在传给父组件了,最后是通过传的机构代码传给提交给后台查询的,但是我们同时也需要相应的机构名字来给客户展现,所以这里面只需要设置两个input就行了,机构代码的input隐藏起来,需要传值,另外的机构名称的input显示出来就可以了,如下:

//将点击跳出目录选择的方法放到显示的机构选择就可以了
<div class="query_condition_item">
 <label>选择机构</label>
 <input name="instName" v-model="instName" readonly @click="showTree()">
</div>

<div class="query_condition_item">
 <input name="instCode" v-model="instCode" hidden>
</div>

这篇文章就到这里了,我将我开发遇到的一些问题经验记录下来,也希望能够帮到大家!!也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
菜鸟javascript基础资料整理3 正则
Dec 06 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
Dec 22 Javascript
JavaScript组件焦点与页内锚点间传值的方法
Feb 02 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
Feb 26 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
javascript简单进制转换实现方法
Nov 24 Javascript
AngularJS Select(选择框)使用详解
Jan 18 Javascript
p5.js入门教程和基本形状绘制
Mar 15 Javascript
vue项目中api接口管理总结
Apr 20 Javascript
JavaScript 九种跨域方式实现原理
Feb 11 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
Sep 02 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 Javascript
无限循环轮播图之运动框架(原生JS实现)
Oct 01 #Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
Oct 01 #Javascript
原生js封装运动框架的示例讲解
Oct 01 #Javascript
JS Testing Properties 判断属性是否在对象里的方法
Oct 01 #Javascript
基于原生js运动方式关键点的总结(推荐)
Oct 01 #Javascript
vuejs使用递归组件实现树形目录的方法
Sep 30 #Javascript
Easy UI动态树点击文字实现展开关闭功能
Sep 30 #Javascript
You might like
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
php中实现获取随机数组列表的自定义函数
2015/04/02 PHP
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
js图片处理示例代码
2014/05/12 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
python全局变量引用与修改过程解析
2020/01/07 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
中学教师培训制度
2014/01/31 职场文书
家长通知书家长评语
2014/04/17 职场文书
施工安全生产承诺书
2014/05/23 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
公共场所标语
2014/06/30 职场文书
培训科主任岗位职责
2014/08/08 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
学习保证书
2015/01/17 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
PHP控制循环操作的时间
2021/04/01 PHP
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python