vue---父子、兄弟、跨层级关系组件通信

news2025/4/17 12:22:43

目录

1、props / $emit (父子通信)

2、$root、 $parent / $children(vue3废弃)

3、ref/$refs

4、EventBus ($emit / $on)

5、provide+inject(依赖注入)

6、$attrs + $listeners(透传)

7、vuex


根据组件之间的关系组件通信方式包括

  • 父子组件:props / $emit / $parent /ref
  • 兄弟组件:$parent / eventbus / vuex
  • 跨层级关系:eventbus /vuex /provide+inject(依赖注入)/$attrs + $listeners(透传)/$root

1、props / $emit (父子通信)

父组件向子组件传递数据是通过props传递的。

子组件传递数据给父组件通过自定义事件$emit触发来通知父级组件进行相应的修改。

//子组件Son.vue
<template>
  <div id="son">
    <p>{{ msg }}</p>
    <button @click="fn">props</button>
    <button @click="changeMessage">$emit</button>
  </div>
</template>
<script>
export default {
  name: "son",
  props: ["msg", "fn"],
  methods: {
    changeMessage() {
      this.$emit("changeMsg", "hello父组件");
    }
  }
};
</script>
//父组件
<template>
  <div id="father">
    <son :msg="msg" :fn="myFunc" @changeMsg="changeMsg"></son>
  </div>
</template>

<script>
import son from "@/components/Son.vue";
export default {
  name: "father",
  components: {
    son
  },
  data() {
    return {
      msg: "父组件"
    };
  },
  methods: {
    myFunc() {
      console.log("父组件方法");
    },
    changeMsg(val) {
      this.msg = val;
    }
  }
};
</script>

vue---父子传值:props与this.$emit()_vue获取父类属性值_maidu_xbd的博客-CSDN博客在vue中,属性props用来实现将父组件的数据传递给子组件。当父组件的属性变化时,将传递给子组件。父组件通过prop向子组件传递数据,子组件可以通过调用内建的$emit方法来触发一个事件https://blog.csdn.net/maidu_xbd/article/details/89134193

2、$root、 $parent / $children(vue3废弃)

子组件通过$root 访问根组件的属性或方法 this.$root.msg; this.$root.myFunc();

子组件通过$parent访问父组件的属性或方法 this.$parent.msg; this.$parent.myFunc();

父组件通过$children访问子组件的属性或方法 this.$children[0].name; this.$children[0].sayHi();

3、ref/$refs

ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例

父组件可以通过$ref访问子组件

注意:$refs 只能在 mounted 生命周期钩子函数被调用之后才能使用。

4、EventBus ($emit / $on)

EventBus ($emit / $on) 事件总线适用于 父子、隔代、兄弟组件通信这种方法。通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,从而实现任何组件间的通信,包括父子、隔代、兄弟组件。

// event-bus.js
 
import Vue from 'vue'
export const EventBus = new Vue()

发送事件

//组件a
<template>
  <div>
    <button @click="add">点击增加</button>    
  </div>
</template>
 
<script>
import {EventBus} from './event-bus.js' // 引入事件中心
 
export default {
  data(){
    return{
      num:0
    }
  },
  methods:{
    add(){
      EventBus.$emit('addition', {
        num:this.num++
      })
    }
  }
}
</script>

接收事件

//组件b
<template>
  <div>求和: {{count}}</div>
</template>
 
<script>
import { EventBus } from './event-bus.js'
export default {
  data() {
    return {
      count: 0
    }
  },
  mounted() {
    EventBus.$on('addition', param => {
      this.count = this.count + param.num;
    })
  }
}
</script>

5、provide+inject(依赖注入)

依赖注入:声明了当前组件依赖的父组件们(直系的祖宗)的外部prop有哪些。

隔代组件通信祖先组件中通过 provider 来提供变量,然后在子孙组件中通过 inject 来注入变量。 provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系

vue里面的provide和inject是对$parent的一种优化封装

provide和inject需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效

6、$attrs + $listeners(透传)

通过  v-bind=“$attr”  来传递父组件上的prop class 和 style ,通常配合 inheritAttrs 选项一起使用,多余的属性不会被解析到标签上。

通过  v-on=“$listenser” 来传递父组件上的事件监听器和事件修饰符

子组件对el-input进行二次封装

<template>
  <div>
    <el-input v-bind="$attrs" v-on="$listeners"></el-input>
  </div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped>
/deep/ .el-input__inner {
  border-top: none;
  border-left: none;
  border-right: none;
}
</style>

父组件

<template>
  <div>
    <s-input v-model="value" @blur="onBlur"></s-input>
    {{ value }}
  </div>
</template>
<script>
import SInput from "@/components/SInput.vue";
export default {
  name: "attrs",
  data() {
    return {
      value: "aaa"
    };
  },
  components: {
    SInput
  },
  methods: {
    onBlur() {
      console.log("blur");
    }
  }
};
</script>

7、vuex

适用于 父子、隔代、兄弟组件通信Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )

Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化。

vuex---store状态管理_store strict_maidu_xbd的博客-CSDN博客上篇介绍单一使用vue.js,通过props实现传值https://blog.csdn.net/maidu_xbd/article/details/89134193本篇主要介绍使用vuex,通过store实现传值以及数据状态更改。可以理解为在store中定义全局数据,全局方法。可以供其子组件调用。vuex安装:【npm install vuex --save】vuex主要应...https://blog.csdn.net/maidu_xbd/article/details/89140696

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子政务网络智慧运维方案

随着电子政务建设的深入&#xff0c;我国政府的信息化建设已经具备了一定的规模&#xff0c;形成了部、省、市、县四级体系&#xff1b;大型政务服务事项、公文流转、行政审批、费税征缴、信息公开、网格化社会管理、三网融合、智慧城市建设等大量政府核心业务越来越依赖信息化…

Linux 静态库的制作与使用

目录 静态库1、 什么是库2、 静态库的制作2.1 命名规则与制作规则 3、 静态库的使用 静态库 1、 什么是库 库文件是计算机上的一类文件&#xff0c;可以简单的把库文件看成一种代码仓库&#xff0c;它提供使用者可以直接拿来用的变量、函数或类。库是一种特殊的程序&#xff…

atbetaflight——指定commit号编译固件

一、说明 在开发过程中&#xff0c;比如成员A上传了一次code,而成员B需要测试本次提交的code&#xff0c;但是由于没有搭建ci,成员B就需要自己拉code编译&#xff0c;本文将详细说明编译步骤&#xff1b; 二、步骤 1、使用vscode打开code 在使用git clone下载到code后的文件…

HDCTF2023复盘

文章目录 前言 CryptoNormal_rsaNormal_rsa(Revenge)(低指数e攻击)Math_RSA(二次剩余)爬过小山的看云(hill,云影) MischardMisc(base64)MasterMisc(crc,wav)ExtremeMisc(zip爆破,明文攻击) Reverseeasy_re(Upx,base64)easyasm(xor) WebWelcome To HDCTF 2023(JSFuck)SearchMast…

『C++』异常详解

「前言」文章是关于C异常方面&#xff0c;下面开始讲解 「归属专栏」C嘎嘎 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 少年的肩膀&#xff0c;就该这样才对嘛&#xff0c; 什么都不要急&#xff0c; 先挑起清风明月、杨柳依依和草长…

华为OD机试真题(Java),吃到最多的刚好合适的菜(100%通过+复盘思路)

一、题目描述 入职后&#xff0c;导师会请你吃饭&#xff0c;你选择了火锅。 火锅里会在不同时间下很多菜。 不同食材要煮不同的时间&#xff0c;才能变得刚好合适。你希望吃到最多的刚好合适的菜&#xff0c;但你的手速不够快&#xff0c;用m代表手速&#xff0c;每次下手捞…

作业3综合练习

综合练习: 要求&#xff1a;请给openlab搭建web网站 网站需求: 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于www.openlab.com/student #更改配置文件 &#xff08;虚拟主机标签…

嵌入式51单片机04-矩阵按键系列

文章目录 矩阵按键一、矩阵按键基础知识二、矩阵按键系列代码1. 矩阵按键操作&#xff08;显示数字&#xff09;&#xff08;1&#xff09;仿真电路图&#xff08;2&#xff09;源代码&#xff08;3&#xff09;实验结果 2. 矩阵按键操作&#xff08;控制数码管&#xff09;&am…

STM32的GPIO重映射配置(解除下载端口的重映射)

在设计一个项目的时候&#xff0c;因为用的是STMF103C8T6&#xff0c;引脚较少&#xff0c;所以把可以用的GPIO都需要用上&#xff0c;但是由于下载的引脚在出生时&#xff0c;被厂家已经配置好了&#xff0c;所以我们得利用软件配置一下&#xff0c;使引脚变成正常的GPIO。 手…

安卓12源码编译错误-java.lang.OutOfMemoryError: Java heap space

报错如下&#xff1a; FAILED: out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/api_lint.timestamp out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metala…

Flutter开发日常练习-小猫咪杂货店(新增动画和跳转抖音)

之前的练习加了个详情页面,然后跳转第三方页面抖音用户详情页面 跳转详情页添加了Hero的动画,共享元素过度 一个 标准 hero 动画 使 hero 从一页飞至新页面&#xff0c;通常以不同大小到达不同的目的地。 设定好每个图片的id,通过id作为 Hero 组件的标识,id不能重,否则会报错&…

DHCP笔记

目录 DHCP动态主机配置协议——UDP67/68端口 DHCP获取IP地址 客户端首次获取IP地址 客户端再次获取IP地址 租期/续租 DHCP的工作报文 DHCP的配置 案例 DHCP动态主机配置协议——UDP67/68端口 DHCP是应用层协议&#xff0c;采用C/S服务模式&#xff0c;只能在一个广播域…

TortoiseSVN使用-授权访问

文章目录 3.4.6 授权访问 3.4.6 授权访问 总结&#xff1a; 如果是匿名访问&#xff08;就是不用输入用户名密码的访问方式&#xff09;&#xff0c;请只开启anon-access write如果授权访问&#xff0c;请先设置anon-access none&#xff0c;然后打开3个&#xff1a;auth-a…

C++ “类与对象”

类与对象的概念 类相当于是结构体的声明&#xff0c;是结构体的设计图&#xff0c;而对象是利用设计图的创造的产物. &#xff08;1&#xff09;.类的大小计算 类的大小计算时与结构体类似&#xff0c;但函数是不计入大小的&#xff08;函数放在单独的公共空间&#xff09;. 在…

贝叶斯学习(Bayesian Learning)提高篇

Advanced Bayesian Learning 前言Review Bayes Optimal ClassifierNaive Bayes Classifier这里其实不太懂ExampleLaplace smoothing加完之后原数据的比例会发生变化分子1&#xff0c;如何确定分母的加数 Naive Bayes for Document Classi cationProblem statementDocument repr…

C语言猜数字小游戏

今天&#xff0c;我们来写一个猜数字小游戏&#xff0c;这个游戏的大致规则如下&#xff1a;&#x1f447; 1.电脑会随机生成一个数1~100 2.猜数字 a> 猜大了&#xff0c;提醒猜大了&#xff0c;继续猜 b> 猜小了&#xff0c;提醒猜小了&#xff0c;继续彩 c> 猜对了&…

Windows下版本控制器(SVN)-启动服务器端程序

文章目录 3.3 启动服务器端程序 3.3 启动服务器端程序 ①SVN 服务器必须处于运行状态才能响应客户端请求&#xff0c;帮助我们管理项目文件。 所以我们必须将 SVN 服务器启动起来。启动 SVN 服务器有两种方法&#xff0c;一个是命令 行方式&#xff0c;一个是注册 Windows 服务…

基于容器平台 ACK 快速搭建 Stable Diffusion

作者&#xff1a;子白 本文介绍如何在阿里云容器平台 ACK 上快速搭建一套可对外提供服务的 Stable Diffusion。 CPU 版本 前提条件 已创建 Kubernetes 托管版集群。具体操作&#xff0c;请参见创建 Kubernetes 托管版集群[1]。 &#x1f4cd;无需 GPU&#xff0c;节点需要…

数据库系统概论--第三章课后习题

1.试述SQL的特点。 答:SQL有以下特点: ①综合统一:SQL语言集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体。在关系模型中实体和实体间的联系均用关系表示,这种数据结构的单一性带来了数据操作符的统一性,查找、插入、删除、更新等每一种操作都只需一种操作…

NestJS(1)初识 NestJS 和 Hello, World

初识 NestJS 先来看下官网对 NestJS 的介绍。 Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#xff…