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 相关文章推荐
ajax无刷新动态调用股票信息(改良版)
Nov 01 Javascript
JS 学习笔记 防止发生命名冲突
Jul 30 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
Jul 31 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
Jan 28 Javascript
基于JavaScript实现回到页面顶部动画代码
May 24 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
Jul 24 Javascript
MvcPager分页控件 适用于Bootstrap
Jun 03 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
Jul 03 Javascript
JS运动特效之同时运动实现方法分析
Jan 24 Javascript
快速解决vue-cli在ie9+中无效的问题
Sep 04 Javascript
详解关于Vuex的action传入多个参数的问题
Feb 22 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
Oct 14 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
为查询结果建立向后/向前按钮
2006/10/09 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
Python使用wxPython实现计算器
2018/01/30 Python
python 判断网络连通的实现方法
2018/04/22 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
详解python中各种文件打开模式
2020/01/19 Python
python实现在一个画布上画多个子图
2020/01/19 Python
python调用百度API实现人脸识别
2020/11/17 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
毕业生就业自荐书
2013/12/15 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
市场营销战略计划书
2014/05/06 职场文书
工地质量标语
2014/06/12 职场文书
如何写好竞聘报告
2019/04/03 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫