Vue组件传值的几种常用方式

常用的几种 Vue 父子组件传值方式 这些代码示例展示了 Vue 中父子组件传值的常见方式,包括父组件向子组件传值、子组件向父组件传值、父子组件数据双向绑定以及祖孙组件通信。通过这些方式,可以在不同的组件之间灵活地传递数据,满足各种应用场景的需求。 阅读详情

引言

Vue的两大特性:响应式和组件化。当项目体积和工程量开发到比较大的时候,一个vue文件有几千行代码的时候,这样是不利于开发和维护的,我们经常做的是抽离组件,而谈论组件,不得不考虑组件之间是如何传值的,今天我们就来探讨一下组件之间是如何传递数据的。

1、父组件向子组件通过props传递数据,子组件通过$emit(派发事件的方式)给修改父组件的数据,进而修改子组件数据

// 父组件
<template>
  <div>
    <div >{{title}}</div>
    // 注意 .sync可以帮我们实现父组件向子组件传递的数据的双向绑定
    <Item
      :title.sync="title"
      :pay-type="payType"
      @updateMsg="handleUpdate"
    >
    </Item>
  </div>
</template>
<script>
import Item from './components/Son.vue';
export default {
  components: {Item},
  data () {
    return {
      title: '我是父组件',
      payType: 'tested',
    };
  },
  methods: {
    handleUpdate (val) {
	  this.payType = val;
	}
  }
};
</script>
// 子组件
<template>
  <div>
    <div>{{payType}}</div>
    <el-button @click="handleClick">点我</el-button>
    <el-button @click="handleClick2">再点</el-button>
    <div>{{title}}</div>
  </div>
</template>
<script>
export default {
  props: {
  	title: {
      type: String,
      default: ''
    },
    payType: {
      type: String,
      default: ''
    }
  },
  methods: {
    handleClick () {
      this.$emit('updateMsg', 'testing');
    },
    handleClick2 () {
      // 子组件是可以通过update直接去修改父组件的值的,这里不同于this.$emit触发一个方法通过修改父组件的数据进而修改子组件的数据,这里好好思考一下哦
      this.$emit('update:title', '好像是能改变的');
    }
  }
};
</script>

如果是兄弟组件需要穿插数据呢?
或许有人会问了,为啥不用uex呢?首先我要声明的是Vuex可以实现组件传值,但是当组件多层嵌套时传值会变得很麻烦和繁琐,从最底层的子组件传值至最上层的父组件(或者反过来)可能会跨越好几层组件。

2、EventBus

EventBus 是中央事件总线,父子组件,兄弟组件,爷孙级组件等都可以利用其完成数据传递,也叫全局事件,我们在项目中经常会用得到的,千万不要局限于兄弟组件之间,切记!!!

// eventBus.js
import Vue from 'vue';
export default new Vue;
<template>
  <div>
    <Item></Item>
    <Brother></Brother>
  </div>
</template>
<script>
import Item from './components/Son.vue';
import Brother from './components/Brother.vue';
export default {
  components: {Item, Brother},
};
</script>
// brother组件
<template>
  <div>
    <h3>{{message}}</h3>
  </div>
</template>
<script>
import bus from '@/utils/eventBus.js';
export default {
  name: 'Brother',
  data () {
    return {
      message: '这是兄弟组件的message值'
    };
  },
  mounted () {
    bus.$on('update', (res) => {
      this.message = res;
    });
  },
};
</script>
// son组件
<template>
  <div>
    <el-button type="primary" @click="handleClick">修改</el-button>
  </div>
</template>
<script>
import bus from '@/utils/eventBus.js';
export default {
  methods: {
    handleClick () {
      bus.$emit('update', '我是son组件修改Brother的message值');
    }
  }
};
</script>

3、$attrs / $listeners(多层嵌套组件传递数据或者方法)

// parent组件
<template>
  <div>
    // 注意:不仅可以向后代组件传递数据,还可以传递方法
    <Item :message="msg" :click-function="clickFunction"></Item>
  </div>
</template>
<script>
import Item from './components/Son.vue';
export default {
  components: {Item},
  data () {
    return {
      msg: 'parent组件的数据'
    };
  },
  methods: {
    clickFunction () {
      return '返回个啥呢';
    },
  }
};
</script>
// 子组件
<template>
  <div>
    // $props监听数据,$listeners监听方法
    <Child v-bind="$props" v-on="$listeners" />
  </div>
</template>
<script>
import Child from './Child.vue';
export default {
  components: {Child},
  // 注意:这里的props声明什么,就可以传递给后代组件什么
  props: {
    message: {
      type: String,
      default: ''
    },
    clickFunction: {
      type: Function,
      default: () => {}
    }
  }
};
</script>
// 孙子组件
<template>
  <div>
    {{message}}
    <el-button @click="handleClick">点击</el-button>
  </div>
</template>
<script>

export default {
  props: {
    message: {
      type: String,
      default: ''
    },
    clickFunction: {
      type: Function,
      default: () => {}
    }
  },
  methods: {
    handleClick () {
      let res = this.clickFunction();
      console.log(res);
    }
  }
};
</script>

4、provide / inject

provide/inject 是依赖注入,需要一起使用,可以让我们指定想要提供给后代组件的数据或方法。不论组件嵌套有多深,允许一个祖先组件向其所有子孙后代注入一个依赖,并在起上下游关系成立的时间里始终生效。

// parent组件
<template>
  <div>
    <Item></Item>
  </div>
</template>
<script>
import Item from './components/Son.vue';
export default {
  components: {Item},
  data () {
    return {
      msg: 'parent组件的数据'
    };
  },
  provide () {
    return {
      name: this.msg,
      queryData: this.queryData()
    };
  },
  methods: {
    queryData () {
      return {
        name: '尼玛',
        age: 29,
        money: '$100'
      };
    },
  }
};
</script>
// 子组件
<template>
  <div>
    <Child />
  </div>
</template>
<script>
import Child from './Child.vue';
export default {
  components: {Child},
};
</script>
// 孙子组件
<template>
  <div>
    {{name}}
    <el-button @click="handleClick">点击</el-button>
  </div>
</template>
<script>

export default {
  inject: ['name', 'queryData'],
  methods: {
    handleClick () {
      let res = this.queryData;
      console.log(res);
    }
  }
};
</script>

以上就是项目中组件通信常用的几种方式,你学会了吗

VUE3多层组件传值(复杂场景)provide/inject 单纯使用provide和inject机制只能实现祖父组件向孙组件传递数据,而无法实现孙组件向祖父组件传递数据。如果需要实现双向通信,可以结合provide和inject与事件机制或状态管理库来完成。 阅读详情

相关推荐

VUE部分笔记:多重嵌套的组件传值$attrs和$listeners

多重嵌套的组件A&amp;gt;B&amp;gt;C中 //$attrs在B组件中自动获得在A组件中,B组件上绑定的,除了props传输、.native、CSS和Style之外的数据 //components-a &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;components-b :name=&quot;name&quot;

lyr190的博客 5428

Vue多层组件之间数据通信

使用过程中,如果有存在中间的组件截取了props,那么这个值将不会继续向下传递。相反传递给父元素则没有这个问题。

coding... 1067

Vue EventBus自定义组件事件传递

主要介绍了Vue EventBus自定义组件事件传递,组件化应用构建是Vue的特点之一,本文主要介绍EventBus进行数据消息传递 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

【vue】多层级组件传值(通讯)方式

$listeners和$attrs $listeners是将三级组件的事件和参数传递给一二级组件 $attrs可以将一级组件的数据直接在三级组件中使用,比较优雅的一个传值方式,不用像props那么繁琐 在一级组件中引入二级组件,并将data和message传递给二级组件;getLevel3Messgae是三级组件中的事件 <template> <!-- 一级组件 --> <div class="level-1"> <!-- 二级组件 --&g

八块腹肌的博客 3589

ESP-IDF 利用ESP32构建智能音乐播放器(一)---------- 实现SD卡MP3文件的解码与播放

本文详细介绍了如何利用ESP32和ESP-IDF开发框架,从零开始构建一个智能音乐播放器。文章重点讲解了如何通过SD卡模块读取MP3文件,并集成Helix MP3解码库进行软件解码,最终通过I2S接口驱动音频模块实现播放。内容涵盖硬件连接、软件环境搭建、核心解码与输出逻辑,为嵌入式音频开发提供了完整的实战指南。

weixin_29163797的博客 234

保姆级教程:在Ubuntu 22.04上用VLLM+OpenWebUI部署DeepSeek-R1-14B(含Q8量化模型下载)

本文提供在Ubuntu 22.04上使用VLLM和OpenWebUI部署DeepSeek-R1-14B大语言模型的完整教程,包括环境配置、模型下载、VLLM参数调优及OpenWebUI集成。特别针对Q8量化模型优化部署流程,解决CUDA版本冲突等常见问题,适合开发者快速搭建本地AI对话系统。

weixin_26712075的博客 430

Vue组件间传值常用的几种方式

vue中的props传值

Hanyinh的博客 621

OpenClaw实战:拒绝复制粘贴,用 xlsx 技能打通“带公式模板”的月报自动化

本文详解了如何利用 OpenClaw 框架搭载的 xlsx skill,解决 AI 自动化处理“带复杂公式与格式”Excel 月报时极易翻车的业务痛点。针对传统大模型粗暴写入导致模板报废的问题,OpenClaw 创新采用“双核微创”工作流:首先利用 pandas 高效清洗并聚合海量原始明细数据,随后切换至 openpyxl 将计算结果精准注入目标模板,完美保留原有的底色、边框与跨表动态公式。

我有一个梦想 151

Vue中组件间传值常用的几种方式

主要分为两类: 1.父子组件间的传值 2.非父子组件间的传值 1.父子组件间传值 父组件向子组件传值 第一种方式: props 父组件嵌套的子组件中,使用v-bind:msg=‘xxxx’进行对象的绑定,子组件中通过定义props接收对应的msg对象如图 父组件代码 ``` 传递多个值 <!DOCTYPE html> <html lang="en"> <head>

张晨光老师的播客 885

[关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

本文主要讲解Gephi绘制作者间的关系图谱,该软件可以广泛应用于社交网络、知识图谱分析,推荐读者使用。这是非常基础的一篇文章,重点讲解Gephi使用方法,希望对大家有所帮助。

杨秀璋的专栏 1万+

④ Django创建用户中心应用users,扩展用户信息

本章配套视频教程 Django创建用户中心应用users,扩展用户数据 在settings.py文件中配置项目 1、语言配置:LANGUAGE_CODE = 'zh-hans’ 2、时区配置:TIME_ZONE = 'Asia\Shanghai’ 3、模板路径配置:‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)], 并创建templates文件

轻编程的博客 673

Vue的组件传值常用的方式有哪几种

1 父子组件传参 定义 父组件向子组件传值: 在子组件标签上绑定自定义属性名, eg < child v-bind:msg="‘from Parent msg’" >< /child> 值是父组件需要传递的数据;(from Parent msg 就是父组件要传的数据) 子组件内部通过props属性接收“属性名”,内部通过{{属性名}}显示。 <template> <div class="about"> <div> <h

lzfengquan的博客 468

beegfs读取文件完整流程分析

读取小于512KB文件数据,小于1s 读取15MB文件数据,花费7秒。

wfzy的博客 835

Vue2.0的几种常用传值方式、父传子、子传父、非父子组件传值

Vue2.0 传值方式: 在Vue的框架开发的项目过程中,经常会用到组件来管理不同的功能,有一些公共的组件会被提取出来。这时必然会产生一些疑问和需求?比如一个组件调用另一个组件作为自己的子组件,那么我们如何进行给子组件进行传值呢?如果是电商网站系统的开发,还会涉及到购物车的选项,这时候就会涉及到非父子组件传值的情况。当然你也可以用Vuex状态管理工具来实现,这部分我们后续会单独介绍。 引用官网的一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子

zy2825771384的博客 561

数据分析必问:Pandas面试题及参考答案

DataFrame是Pandas库中的一个核心数据结构,它类似于Excel中的表格,可以存储不同类型的数据。在Pandas中,抽样操作通常很简单,但是需要根据数据的特点和分析的需求来选择合适的抽样方法。数据标准化和归一化是数据预处理中常用的技术,目的是将数据调整到一个合适的范围内,以消除不同特征量纲和数值范围的差异,从而保证模型训练的有效性。CSV文件是一种文本文件,其中的数据以逗号分隔。不平衡数据集指的是数据集中各类别样本的数量差异较大的情况,这可能导致模型训练出现偏差,影响模型的泛化能力。

大模型大数据攻城狮的专栏 3009

领域知识图谱构建的技术流程

因此概念的属性定义十分重要,通常大部分知识库中的概念属性都是采用人工定义等方式生成的,通用知识图谱则可以从开放数据集中获取概念的属性,然后从在线百科中学习实体的属性,并对实体属性进行往上规约从而生成概念的属性。由于百科的分类体系都是经过了百科管理员或是高级编辑人员的校验,其分类系统中的数据可靠性非常高,因此从百科中抽取概念和实体,通常将标题作为实体的候选,而将百科中的分类系统直接作为概念的候选。为了对知识进行合理的组织,更好地描述知识本身与知识之间的关联,需要对知识图谱的模式进行良好的定义。

weixin_43961909的博客 334

vue中常见的传值方式

vue中的传值方式 在平时项目开发中,经常使用的VUE开发的时候,会把一些功能相似的模块封装成一个组件.在像组件传入相关通信,然后就可以实现功能的输出,不必注重内在逻辑的实现,这可以理解为封装,组件的主要的通信方式就是’接口’,这个接口可以是一个参数或者是一个函数操作的开始.哈哈,说了这么多这是我自己的见解.说远了,我们具体说说VUE的传值方式. VUE中的传值方式有几种常见的方式,例如:父子组件通信,兄弟组件通信,vuex状态管理等等;这些也不准备仔细展开讲,只是简单的汇总一下遇到的各种VUE传值方式.

qq_45272329的博客 900

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

vue 父子组件之间的传值问题

Vue学习(二)-Vue中组件间传值常用的几种方式 - 听风是雨 - 博客园

m0_46694046的博客 150

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

vue组件传值的13种方式

vue组件传值 不写这篇文章,我自己都不知道我知道的vue组件传值的方式竟然有13种之多,其实静下来想想,常用的也有五六种。 1、父组件传给子组件 在子组件里定义一个props,即props:[‘msg’],msg可以是对象也可以是基本数据类型 如果你想定义一个默认值,即 props:{msg: {type: String, default: ‘hello world’}}, 需要注意的是这种传值是...

dan_seek的博客 6万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

vue组件传值的几种方式

一、父子组件、非父组件传值 1、父组件向子组件传值 父组件向子组件传值就是通过在父组件中让子组件标签绑定父组件的数据,子组件的props接收父组件穿过来的值即可 父组件 子组件 2、子组件向父组件传值 子传父的实现方式就是用了 this.emit来遍历getData事件,首先用按钮来触发setData事件,在setData中用this.emit 来遍历 getData 事件,首先用按钮来触...

k393393的博客 5472

vue组件之间传值的几种方式

vue组件传值 父子组件之间传值。几种常见方式 第一种方式(父传子) 父组件 <m-child v-bind:msg="'from parent msg'"></m-child>//在父组件上面绑定一个msg 注意:数据绑定的时候记得加 : 如果后面的数据是字符串则不用加 双引号 如果实在要加 : 的时候写法 :msg="‘i am item’" ,因为 :msg 默认把后面的识别变量,所以后面记得在字符串里面单引号,直接msg默认是字符串,后面不用加 子组件(mCh

小菜鸟的博客 1万+

vue-组件传值总结

Vue.js中实现组件间传值的方法有多种,本文章讲述了最常见的几种传值方式的包括了详细讲解和演示示例,在忘记的的时候常来看看即可快速记起

x15514104477的博客 5980

Vue子组件向父组件传值的几种方式

一. 使用slot插槽 1.子组件: <template> <div> <slot name="icon" :text="text"></slot> </div> </template> <script> export default{ data(){ return {...

我唤来了星繁,似灭似绚烂 9618

【vue】深入探讨vue中组件间多种传值方式

vue中每个组件都是隔离的,包括父组件和子组件,各组件之间需要数据通信,就涉及到了组件传值,本文详细阐述了vue组件传值的各种方法与技巧。

景天科技苑 2907

Vue中常用的几种传值方式

1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为data里面的数据即可。 父组件代码: <template> <div id="container"> <input type="text" v-model="text" @change="dataChange"> <Child :msg="text">.

铁锤妹妹的博客 3713

vue 组件传值

前言:在我们vue项目中组件传值大致可以分为三大类,1、子组件传值给父组件,2、父组件传值给子组件,3、兄弟组件之间传值; 1、父组件传值给子组件: 1.1、定义父组件 //父组件 //引入的add-widget组件 //使用 v-bind 的缩写语法通常更简单: <add-widget :msg-val="msg"> //这里必须要用 - 代替驼峰 // HTML 特性是不区分大小写...

小傲哥哥的博客 4942
上一篇: 如何设计一个promise.all?
下一篇: 微信小程序之蓝牙连接全过程封装
其人美且偲
博客等级 码龄4年 24粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值