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 相关文章推荐
jquery BS,dialog控件自适应大小
Jul 06 Javascript
Javascript全局变量var与不var的区别深入解析
Dec 09 Javascript
js使下拉列表框可编辑不止是选择
Dec 12 Javascript
最简单的JavaScript图片轮播代码(两种方法)
Dec 18 Javascript
使用JS代码实现点击按钮下载文件
Nov 12 Javascript
JS实现微信弹出搜索框 多条件查询功能
Dec 13 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
Mar 07 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 Javascript
解决vue打包后vendor.js文件过大问题
Jul 03 Javascript
Vue开发环境跨域访问问题
Jan 22 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
Jul 17 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
Aug 12 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
php绘制一个矩形的方法
2015/01/24 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
php生成word并下载代码实例
2019/03/15 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
2014/09/25 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
python中的二维列表实例详解
2018/06/19 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
Python类型转换的魔术方法详解
2020/12/23 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
英语专业学子个人的自我评价
2013/10/02 职场文书
员工教育培训协议书
2014/09/27 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
同事去世追悼词
2015/06/23 职场文书
聘任合同书
2015/09/21 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
初中政治教师教学反思
2016/02/23 职场文书
Redis入门基础常用操作命令整理
2022/06/01 Redis
Go gorilla/sessions库安装使用
2022/08/14 Golang