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 相关文章推荐
引用其它js时如何同时处理多个window.onload事件
Sep 02 Javascript
angularJS 中$attrs方法使用指南
Feb 09 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
Aug 27 Javascript
JavaScript实现搜索框的自动完成功能(一)
Feb 25 Javascript
AngularJS内建服务$location及其功能详解
Jul 01 Javascript
Vue分页组件实例代码
Apr 17 Javascript
JavaScript实现开关等效果
Sep 08 Javascript
使用react实现手机号的数据同步显示功能的示例代码
Apr 03 Javascript
Vue 开发必须知道的36个技巧(小结)
Oct 09 Javascript
vue 解决文本框被键盘遮住的问题
Nov 06 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 Javascript
vue 递归组件的简单使用示例
Jan 14 Vue.js
无限循环轮播图之运动框架(原生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简单静态页生成过程
2008/03/27 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
简单实现JS计算器功能
2016/12/21 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
import的本质解析
2017/10/30 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
Python元组知识点总结
2019/02/18 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
python文件排序的方法总结
2020/09/13 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
淘宝活动策划方案
2014/02/06 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
信息技术课后反思
2014/04/27 职场文书
公司副总经理任命书
2014/06/05 职场文书
运动会表扬稿
2015/01/16 职场文书
学生保证书格式
2015/02/27 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
Redis特殊数据类型bitmap位图
2022/06/01 Redis