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 相关文章推荐
Prototype使用指南之selector.js说明
Oct 26 Javascript
js 判断 enter 事件
Feb 12 Javascript
学习ExtJS Window常用方法
Oct 07 Javascript
JavaScript基础教程之alert弹出提示框实例
Oct 16 Javascript
js获取表格的行数和列数的方法
Oct 23 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 Javascript
浅谈JavaScript对象的创建方式
Jun 13 Javascript
vue实现列表的添加点击
Dec 29 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
Sep 15 Javascript
JavaScript代码调试方法实例小结
Jan 05 Javascript
简单了解JavaScript arguement原理及作用
May 28 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
Oct 17 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编写PDF文档生成器
2006/10/09 PHP
PHP4在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
一个php作的文本留言本的例子(三)
2006/10/09 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
PHP多维数组排序array详解
2017/11/21 PHP
php生成word并下载代码实例
2019/03/15 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
python config文件的读写操作示例
2019/09/27 Python
ubuntu上安装python的实例方法
2019/09/30 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
python中@contextmanager实例用法
2021/02/07 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
法制宣传教育方案
2014/05/09 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
个人原因辞职信模板
2015/05/13 职场文书
法院答辩状格式
2015/05/22 职场文书
物业公司管理制度
2015/08/05 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript