详解Vue组件之间的数据通信实例


Posted in Javascript onJune 17, 2017

最近在用vue做项目,学习了不少东西,但是有时候光顾着做项目却忘记要找个时间来整理一下最近的一些学习新得,因为是新手,所以可能会有错误的地方,欢迎指出和交流呀~~~

关于父子组件以及非父子组件之间的数据通信

详解Vue组件之间的数据通信实例

1 父子组件之间数据通信

一般父组件向子组件传递数据用prop进行传递,注意,子组件不能对prop中的数据进行更改,vue中规定是防止子组件对父组件中的数据进行窜改。而子组件向父组件进行数据传递则可以通过事件触发父组件的事件来实现数据的传递。(是不是有点懵逼了,看个例子吧 )

(这里我就直接摘取一段项目中的例子代码来说明)

使用prop进行数据传递:

//这是父组件中的部分代码,父组件向子组件<handle-Employee><handle-Employee>传递数据(method,dialogFormvisible)
 // 父组件的部分代码
<!--添加员工模块-->
   <div class="add">
    <el-button type="primary" icon="edit" @click="handleAdd">新增员工</el-button>
    <handle-Employee :method="method"
     :dialogFormVisible="dialogFormVisible" @close="closeDialog" @getEmployee="getEmployee"></handle-Employee>
   </div>
  </div>
// 父组件的script代码
 export default {
  data () {
   return {
    method:{handle: 'add‘, title: '增加员工'}
    dialogFormvisible: false
 }
 } 
}

// 子组件中则需要加prop属性数据 ,如下所示:
 export default {
   props: [ 'method', 'dialogFormVisible']
 }

//所以只要父组件中的数据变化修改,子组件中的数据也会跟这修改;

在chrome中用vue-devtool其实也可以看到相关的数据属性;

详解Vue组件之间的数据通信实例

当然,子组件做完相关操作之后,需要时间的是将属性值dialogFormVisible重新修改为false。若是直接在子组件进行修改的话,就会报错,因为会影响到父组件的数据,vue中规定不能直接对prop的属性值进行修改。那么就可以用事件触发来实现子组件向父组件传递数据了。

详解Vue组件之间的数据通信实例

///父组件监听子组件的事件,通过@close="closeDialog"和@getEmployee="getEmployee"来实现监听;
一旦子组件中的事件close和getEmployee发生之后,就会触发父组件中的事件closeDialog和getEmployee事件。
// 父组件的部分代码
<div class="add">
  <el-button type="primary" icon="edit" @click="handleAdd">新增员工</el-button>
  <handle-Employee :method="method" :dialogFormVisible="dialogFormVisible" @close="closeDialog" ></handle-Employee>
</div>

//子组件中的事件分发 
export default {
methods: {
 // 关闭弹出框
   closeDialog () {
    this.$emit('close', false)  //这里就是直接触发子组件的close事件,一旦这个执行,父组件中的对应方法就会执行。
   }
}
}
// 当那边触发关闭事件的时候,这边的显示值就要关闭,那边会传过来一个false

// 父组件的事件
export default {
methods: {
 // 当那边触发关闭事件的时候,这边的显示值就要关闭,那边会传过来一个false
  closeDialog (val) {
    this.dialogFormVisible = val
   }
}
}

这样就实现了父子组件之间的数据传递;

2 实现非父子组件之间的数据传递

通过建立中间的事件bus总线。实现非父子组件之间的数据通信。

  1. 首先建立事件bus,我会新建一个bus.js文件;注册bus。
  2. 分别在组件中使用emit和on实现数据之间的通信;

1 bus.js文件

//bus.js,注册Bus
import Vue from 'vue'
export default new Vue()

2 组件emit触发事件

<template>
 <div class="add-task" :class="{'ishide':isAdding}" @click="addtask()">
  <i class="fa fa-plus-circle" aria-hidden="true"></i>
  添加任务
 </div>
</template>
<script>
 import Bus from '@/bus'
 export default {
 methods: {
 props: ['index'],
  data () {
   return {
    isAdding: false
   }
  },
   addtask () {
    this.isAdding = true
    Bus.$emit('adding-task', this.isAdding, this.index) // 这里触发的事件是'adding-task',
    传递了两个参数,分别是this.isAdding和this.index
    this.$emit('addtask')
   }
  }
 }

3 另外一个组件on接收事件

// 模板中的代码就不展示了。
主要展示的是script中的代码
export default{
data() // 这里的数据也不一一显示啦;
created () {
// 这里使用on监听了adding-task事件,接收到两个参数。所以一旦上面的组件中的adding-task事件触发,这里就会监听到。
   Bus.$on('adding-task', (state, index) => {
    if (this.index === index) {
     this.isShow = state
    }
   })
  }
}

缺点:

有时候小的子组件在页面中有很多个,需要复用,那么为了防止每一次触发相应的事件的时候,都会影响到监听的对应组件,如下图所示。我的解决方案就是给每一个循环的子组件赋值一个index的值;

详解Vue组件之间的数据通信实例

//这里我会在每一次组件emit的时候传递一个index的值,另外一个组件on之后接受参数,会先判断该index是不是与自己的index相等,如果相等才执行相应的数据改变操作。
 Bus.$on('adding-task', (state, index) => {
    if (this.index === index) {
     this.isShow = state
    }

今天先到这里,困了。还有更复杂的数据通信是用vuex,不过我现在的项目应该是暂时还不会用到,所以以后用到再去深入了解。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery、js操作checkbox全选反选
Mar 12 Javascript
JQuery插件Marquee.js实现无缝滚动效果
Apr 26 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
Aug 29 Javascript
运用js教你轻松制作html音乐播放器
Apr 17 Javascript
javascript输出AscII码扩展集中的字符方法
Dec 26 Javascript
JavaScript定义全局对象的方法示例
Jan 12 Javascript
js按条件生成随机json:randomjson实现方法
Apr 07 Javascript
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
Vue条件循环判断+计算属性+绑定样式v-bind的实例
Sep 18 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 Javascript
Vue.js中的组件系统
May 30 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 #Javascript
webpack学习教程之publicPath路径问题详解
Jun 17 #Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
Jun 17 #Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
Jun 17 #Javascript
js简易版购物车功能
Jun 17 #Javascript
Webpack如何引入bootstrap的方法
Jun 17 #Javascript
Webpack执行命令参数详解
Jun 17 #Javascript
You might like
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
php smarty模版引擎中的缓存应用
2009/12/02 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
php数组键值用法实例分析
2015/02/27 PHP
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
不可错过的十本Python好书
2017/07/06 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
一份Java笔试题
2012/02/21 面试题
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
护士求职简历自我评价
2015/03/10 职场文书
安全伴我行主题班会
2015/08/13 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS
Golang获取List列表元素的四种方式
2022/04/20 Golang
Django框架中视图的用法
2022/06/10 Python