vue 组件间的通信之子组件向父组件传值的方式


Posted in Javascript onJuly 29, 2020

父组件向子组件传值:父组件通过属性向下传值的方式和子组件通信;

使用步骤:

定义组件:现有自定义组件com-a、com-b,com-a是com-b的父组件;

准备获取数据:com-b要获取父组件data中的name属性;

<com-b :name=“name”></com-b> 使用v-bind 绑定name属性,红色部分为属性名称,可以随意写。

在子组件定义部分里添加选项,值是个字符串数组 props:[‘name'],将上边红色的属性名称写在这里;

之后就可定义在子组件中使用name属性了;

好了,接着本文的重点内容。

写vue,如果页面涉及到多个组件,就会涉及组件之间的通信,可能是父子组件间的通信,也可以是同级组件间的通信,那么,vue里面的组件如何通信。一般来说在vue的数据传递是在父组件传子组件通过属性来传,子组件传父组件通过事件来传值。

1. 子组件通过通过this.$emit()的方式将值传递给父组件;
2. 通过vuex来传递组件间的数据;
3. 通过中央总线来传递组件间的数据;
4. 通过修改父组件传过来的对象属性
5. 父组件使用子组件的引用ref调用子组件的方法获取子组件的数据

一、子组件通过this.$emit()的方式将值传递给父组件,父组件里面的子组件通过@func绑定一个函数来处理

子组件传过来的数据

<template>
  <div class="app">
    <input @click="sendMsg" type="button" value="给父组件传递值">
  </div>
</template>
<script>
export default {
 
  data () {
    return {
      //将msg传递给父组件
      msg: "我是子组件的msg",
    }
  },
   methods:{
     sendMsg(){
       //func: 是父组件指定的传数据绑定的函数,this.msg:子组件给父组件传递的数据
       this.$emit('func',this.msg)
     }
   }
}
</script>

父组件

<template>
  <div class="app">
    <child @func="getMsgFormSon"></child>
  </div>
</template>
<script>
import child from './child.vue'
export default {
  data () {
    return {
      msgFormSon: "this is msg"
    }
  },
  components:{
    child,
  },
  methods:{
      getMsgFormSon(data){
        this.msgFormSon = data
        console.log(this.msgFormSon)
      }
  }
}
</script>

二、通过vuex来传递组件间的数据

vuex就是把数据放到内存里面去,各个组件间都可以共享vuex里面的数据

1.在一个组件间调用this.$store.dispatch(‘findUserInfoList', q_userInfo_form); 来触发vuex里面函数修改vuex的数据,然后在另一个组件用计算属性映射获取vuex的这个属性值,就可以实现组件间的数据传递

computed: mapState({
   //映射vuex的相关属性值
   userInfoList: state => state.userInfoModule.userInfoList,
   start: state => state.userInfoModule.start,
   total: state => state.userInfoModule.total,
}),
method:{
   //查询操作
   findUserInfoList: function(q_userInfoForm, start){
     this.q_userInfoForm.start = (start === null) ? 1 : start;
     this.$store.dispatch('findUserInfoList', q_userInfo_form);
   },
}

三、通过中央总线来传递组件间的数据

对于一些简单的项目里的可能又不是父子组件,可能是同级组件的,另一方面又没有必要使用Vuex,针对这种情形可以使用中央事件总线(Event Bus)来解决问题,主要用到vue对象的on和on和on和emit事件,在同一个vue的实例可以触发这两个事件,比如子组件传递数据到父组件,在子组件通过同一个vue对象触发emitvue的emit事件传递数据,在父组件通过vue实例的emit事件传递数据,在父组件通过vue实例的on监听刚刚emit触发的事件来获取子组件传递过来的数据

先创建一个constantsBus.js文件,里面根据不同模块创建相关的vue实例

/**
 * 不同组件间通讯用的 中央事件总线
 */

import Vue from 'vue';

//用户管理总线
export const userBus = new Vue();

//管理员管理总线
export const adminBus = new Vue();

在一个组件间调用$emit传递数据

//引用刚刚创建的constantsBus.js
import * as constantsBus from '@/common/constantsBus';

vue 组件间的通信之子组件向父组件传值的方式

4. 在另个接收数据的组件用$on来监听获取emit传过来的数据

created() {
   let that = this;
   //监听子组件的事件,获取其他组件传递过来的data数据
   constantsBus.processBus.$on('processChooseAssessor', data => {
     //获取emit触发的processChooseAssessor事件传递过来的data数据
   });
},

四、通过修改父组件传过来的对象属性

一般来说在vue的数据传递是在父组件传子组件通过属性来传,但是通过属性来传值,是单向的,子组件不能修改父组件的prop值,如果在子组件里面修改父组件传过来的prop属性值,会报错,但是也有例外,对象类型的除外,如果父组件传给子组件的属性是对象的话,是可以修改对象里面的值的,并且修改后也对父组件可见,因为对象的话最后的引用都是指向同一块内存,不受子组件不可以修改父组件的属性约束。(不过不建议这样处理,子组件可以修改父组件的属性会污染数据传递,可能以后在那个子组件改了都不知道,一般对象的传递要深拷贝)

五、父组件使用子组件的引用ref调用子组件的方法获取子组件的数据

1.在子组件写一个获取数据的方法

vue 组件间的通信之子组件向父组件传值的方式

2.父组件通过子组件的ref调用这个方法获取子组件的数据

<trademark-file-upload ref="trademarkFileUpload" :uploadFileList="uploadFileList"></trademark-file-upload>

<script>
let fileList = this.$refs.trademarkFileUpload.getFileList();
<script>

到此这篇关于vue 组件间的通信之子组件向父组件传值的方式的文章就介绍到这了,更多相关vue 子组件向父组件传值内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
会自动逐行上升的文本框
Jun 30 Javascript
javascript 表单验证常见正则
Sep 28 Javascript
JS 实现图片直接下载示例代码
Jul 22 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
Jan 13 Javascript
AngularJS 实现JavaScript 动画效果详解
Sep 08 Javascript
详解Angular的双向数据绑定(MV-VM)
Dec 26 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
Jan 20 Javascript
js清除浏览器缓存的几种方法
Mar 15 Javascript
使用express+multer实现node中的图片上传功能
Feb 02 Javascript
jquery分页优化操作实例分析
Aug 23 jQuery
layui 中select下拉change事件失效的解决方法
Sep 20 Javascript
简单了解three.js 着色器材质
Aug 03 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
Jul 29 #Javascript
vuex管理状态仓库使用详解
Jul 29 #Javascript
解决vue项目获取dom元素宽高总是不准确问题
Jul 29 #Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 #Javascript
Vue实现input宽度随文字长度自适应操作
Jul 29 #Javascript
vue 判断元素内容是否超过宽度的方式
Jul 29 #Javascript
在vue中实现给每个页面顶部设置title
Jul 29 #Javascript
You might like
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
小程序云开发实战小结
2018/10/25 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Python语言的变量认识及操作方法
2018/02/11 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
python中setuptools的作用是什么
2020/06/19 Python
Python和Bash结合在一起的方法
2020/11/13 Python
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
艺人经纪人岗位职责
2014/04/15 职场文书
2014年度培训工作总结
2014/11/27 职场文书
音乐之声观后感
2015/06/04 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
Python函数中的不定长参数相关知识总结
2021/06/24 Python
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
英镑符号 £
2022/02/17 杂记
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server