详解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 相关文章推荐
JS.findElementById()使用介绍
Sep 21 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
Mar 26 Javascript
Javascript获取表单名称(name)的方法
Apr 02 Javascript
jQuery基础知识点总结(DOM操作)
Jun 01 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
Oct 11 Javascript
详解angular中通过$location获取路径(参数)的写法
Mar 21 Javascript
基于JSON数据格式详解
Aug 31 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
Sep 27 Javascript
详解从react转职到vue开发的项目准备
Jan 14 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
May 29 Javascript
jquery+css3实现的经典弹出层效果示例
May 16 jQuery
如何用JavaScipt测网速
May 09 Javascript
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
拼音码表的生成
2006/10/09 PHP
PHP编写简单的App接口
2016/08/28 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
JS 常用校验函数
2009/03/26 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
Angular路由简单学习
2016/12/26 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
详解python中的 is 操作符
2017/12/26 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
django使用JWT保存用户登录信息
2020/04/22 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
应届实习生的自我评价范文
2014/01/05 职场文书
员工晚婚的请假条
2014/02/08 职场文书
高二学生评语大全
2014/04/25 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
社区活动策划方案
2014/08/21 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python