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的网页SELECT下拉框美化代码
Oct 28 Javascript
基于jquery的可多选的下拉列表框
Jul 20 Javascript
javascript 回到顶部效果的实现代码
Feb 17 Javascript
一个获取第n个元素节点的js函数
Sep 02 Javascript
jQuery中DOM树操作之复制元素的方法
Jan 23 Javascript
js+html5实现canvas绘制镂空字体文本的方法
Jun 05 Javascript
leaflet的开发入门教程
Nov 17 Javascript
jquery实现数字输入框
Feb 22 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
Apr 07 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
深入koa-bodyparser原理解析
Jan 16 Javascript
ES6小技巧之代替lodash
Jun 07 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
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
package.json各个属性说明详解
2020/03/11 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
python搭建简易服务器分析与实现
2012/12/15 Python
Python中的装饰器用法详解
2015/01/14 Python
python递归计算N!的方法
2015/05/05 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
大学毕业生自荐书怎么写?
2014/01/06 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
家长通知书家长意见
2015/06/03 职场文书
立案决定书范文
2015/06/24 职场文书
安全生产培训心得体会
2016/01/18 职场文书
浅谈Vue的computed计算属性
2022/03/21 Vue.js
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS