vue---组件通信

news2024/9/23 23:30:38

目录

1、组件跨层级访问

(1)$emit

(2)$root 、 $parent、$refs

2、依赖注入

3、透传及组件二次封装


组件间通信的三种方案: 1、组件跨层级访问,2、依赖注入,3、透传(用于组件二次封装)

1、组件跨层级访问

(1)$emit

严格按照单项数据流的规范来说,直接从子组件去修改父组件是不被允许的,但我们可以通过emit事件来通知父级组件进行相应的修改。在每一层都进行emit,这个过程很是枯燥和乏味,而且一旦传错,排查起来也不方便。

(2)$root 、 $parent、$refs

子组件可以通过$root 访问根组件,通过$parent访问父组件

vue在每个实例上够提供了$root 和 $parent 属性。可以通过$root访问当前单页应用的根组件,通过$parent来访问当前组件的父组件,相应的也就可以直接修改根组件或父组件的属性或是调用根组件或父组件上的方法。

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

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

$parent 和 $root 在各个生命周期钩子函数中都可以使用。

虽然使用$root 和 $parent 可以方便地修改内容,但这不可避免了造成了子组件和相应根组件或者父组件之间的强耦合,即使用了$parent的子组件必须和相应的父组件成对使用,缺一不可。

在组件化的设计中,像这类的组件不好扩展。

举例如下图:一对组件app 和 content, app是父 ,content是子,子组件 content 有一个say方法 this.$parent.fish.love

如果新增需求,要求在App2里面也有这么一个儿子组件content,那我们很自然的就会想到直接拿来用了,可这时出现了问题 直接调用 say 方法 this.$parent.fish is undefined, 因为新的App2没有这个变量。这就尴尬了,这就搞的我们在用一个组件的时候,要把这个组件全部审查一遍,非常耗费时间。

vue里面提供依赖注入的方式来解决这个问题。

2、依赖注入

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

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

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

依赖注入实现原理:

出处:vue2.0源码,vue2.0/src/core/instance/inject.js

inject也是通过$parent, 依次往父组件上去寻找声明了的provide对象。

和prop类似,那为什么还需要provide / inject呢?
因为在现实的项目中,我的一个组件嵌套着好几层组件,如果运用prop一层层的嵌套传递,就非常的麻烦。而provide / inject就解决了这个问题,只要在顶层父级provide里声明对象或方法,那么下一层级无论多深都能够通过inject来访问到provide的数据。

依赖注入的优点:

祖先组件不需要知道哪些后代组件使用它提供的属性

后代组件不需要知道被注入的属性来自哪里

依赖注入的缺点:

组件间的耦合较为紧密,不易重构,使得组件复用性受到影响。

提供的属性是非响应式。

无法追踪数据的来源,在任意层级都能访问导致数据追踪比较困难,不知道是哪一个层级声明了这个或者不知道哪一层级或若干个层级使用了

3、透传及组件二次封装

透传方案 $attr 和 $listener:通过  v-bind=“$attr”  来传递父组件上的prop class 和 style 通过  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>

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

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

相关文章

React Hooks 钩子函数错误用法,你还在犯这些错误吗

React Hooks 常见错误 前言 本片文章主要是在写react hooks的时候&#xff0c;遇到的常见错误的写法&#xff0c;和错误。也是一个对只是的巩固和总结。 错误一 上代码&#xff1a;正确写法 function TestReactHooksError() {const [test, setTest] useState(test);useEff…

论文阅读:PVO: Panoptic Visual Odometry

全景视觉里程计、同时做全景分割和视觉里程计 连接&#xff1a;PVO: Panoptic Visual Odometry 0.Abstract 我们提出了一种新的全景视觉里程计框架PVO&#xff0c;以实现对场景运动、几何和全景分割信息的更全面的建模。我们将视觉里程计(VO)和视频全景分割(VPS)在一个统一的…

【hello Linux】进程间通信——匿名管道

目录 前言&#xff1a; 总结下上述的内容&#xff1a; 1. 进程间通信目的 2. 进程间通信的分类 1. 匿名管道 2. 匿名管道的使用 1. 匿名管道的创建 2. 使用匿名管道进行父子间通信 Linux&#x1f337; 前言&#xff1a; 进程具有独立性&#xff0c;拥有独立的数据、代码及其他…

人工智能时代来临,殊不知低代码早已出手

科普一下人工智能的等级划分&#xff0c;按照实力&#xff0c;人工智能可以分为弱人工智能(Artificial Narrow Intelligence&#xff0c;简称ANI)、强人工智能(Artificial General Intelligence简称AGI)、超人工智能(Artificial Superintelligence简称ASI)三个等级。 弱人工智能…

Windows下 批量重命名文件【bat实现】

目录 前言 一、Windows简单实现重命名 二、使用命令行和Excel实现重命名 前言 在实际应用中&#xff0c;我们经常会遇到将指定文件夹下的文件重命名&#xff0c;以便程序读写。 本文介绍了两种方式&#xff0c;都是在Windows系统中自带的重命名方式。 一、Windows简单实现…

面试题目 002

分享一位读者面试美团 java 岗位的面经。主要在考察 javamysql 算法题目 最长回文串 根据前序中序恢复二叉树 说一说 MySQL 的索引 MySQL 的索引是一种存储数据结构&#xff0c; 按照数据结构划分&#xff0c;MySQL 可以分为 B 树索引、Hash 索引、全文索引 按照 B 树的叶子…

Windows云主机崩溃了怎么办?

​  无法避免服务器崩溃已不是什么秘密&#xff0c;无论选择Windows 云主机还是 Linux 云主机。但不可否认的是&#xff0c;任何错误都可能给企业带来灾难性的后果。该怎么办?持续监控服务器是可能的解决方案之一。即便如此&#xff0c;如果服务器已经处于关闭阶段&#xff…

机器学习实战教程(十):逻辑回归

概述 逻辑回归&#xff08;Logistic Regression&#xff09;是一种用于解决二分类或多分类问题的统计学习方法。它以自变量线性组合的形式进行建模&#xff0c;并使用Sigmoid函数将结果映射到[0, 1]的值域内&#xff0c;表示样本属于某个类别的概率。 Logistic Regression是最…

6个好用的企业管理软件推荐

企业管理软件的范围很广&#xff0c;财务、人力、客户关系管理、ERP、客户体验管理等等。国内来看&#xff0c;有些企业管理软件产品能覆盖企业数字化所有部分&#xff0c;在每个领域&#xff0c;也有很突出的头部厂商&#xff0c;产品功能和服务都大幅领先于竞对&#xff0c;我…

Redis学习笔记大全

文章目录 1、redis概述和安装1.1、安装redis1.2、启动redis方式1&#xff1a;前台启动&#xff08;不推荐&#xff09;方式2&#xff1a;后端启动&#xff08;推荐&#xff09; 1.3、关闭redis1.4、进入redis命令窗口1.5、redis命令大全1.6、redis介绍相关知识 2、redis 5大数据…

PyTorch实战3:天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营-第P3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 目录 一、前期准备1、导入数据2、transforms.Compose详…

JavaWeb+JSP内置对象+Session+Cookie+ 过滤器Filter+ 监听器Listener(超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

从 Milvus 2.2 到 2.2.6,我们是如何持续稳定升级的

最近&#xff0c;Milvus 发布了 2.2.6 版本&#xff0c;在修复了一些 bug 后&#xff0c;Milvus 变得越发稳定。 事实上&#xff0c;自 Milvus 升级至 2.X 版本以来&#xff0c;我们一直在努力改进及优化&#xff0c;推出了诸如从文件中批量导入数据、基于磁盘的近似最近邻&…

通过ppt制作圆形图标及自定义形状图形制作

今天做PPT时&#xff0c;需要一个圆形的截图&#xff0c;日常截图都是方形的&#xff0c;能不能把截图裁剪为一个圆形呢&#xff1f;于时从网上找了一下&#xff0c;发现还真有。 制作工具&#xff1a;PPT 制作步骤&#xff1a; 1、准备图片 将截图或图片插入PPT中 2、在…

(04)基础强化:接口,类型转换cast/convert,异常处理,传参params/ref/out,判断同一对象

一、复习 1、New的截断是指什么&#xff1f; new除了新开空间创建初始化对象外&#xff0c;还有一个隐藏父类同名方法的作用。 当子类想要隐藏父类同名的方法时用new&#xff0c;用了new后父类同名方法将到此为止&#xff0c;后面 继承的…

electron+vue3全家桶+vite项目搭建【15】vue3+sass实现多主题一键切换,支持electron多窗口同步更新

文章目录 引入实现效果展示实现思路整理实现步骤1.定义全局主题样式变量2.定义主题模板3.封装颜色工具类4.初始化主题色5.主进程监听颜色修改6.补充主题状态管理7.主题一键切换组件8.测试案例 引入 我们之前在这篇文章中集成了 sass&#xff0c;接下来我们结合sass的变量定义&…

银行数字化转型导师坚鹏:宏观经济形势分析与银行发展模式创新

宏观经济形势分析与银行发展模式创新 课程背景&#xff1a; 很多学员存在以下问题&#xff1a; 不知道我国目前的宏观经济形势&#xff1f; 不清楚宏观环境对我国经济的影响&#xff1f; 不知道银行未来主要的发展模式&#xff1f; 课程特色&#xff1a; 精彩解读宏…

最新:机器学习在生态、环境经济学中的实践技术应用及论文写作

查看原文>>>最新&#xff1a;机器学习在生态、环境经济学中的实践技术应用及论文写作 目录 专题一、理论基础与软件介绍 专题二、数据的获取与整理 专题三、常用评价方法与相关软件详细教学&#xff08;案例详解&#xff09; 专题四、写作要点与案例的讲解 近年来…

Redis数据库常用语句

Redis数据库常用语句 前言1. 键(Key)的基本操作1.1 增加新的键值对1.2 访问键的值1.3 修改键值对1.4 键值对的删除1.5 判断键值对是否存在1.6 获取所有键1.7 删除所有的键&#xff1a; 2. Redis 中的列表2.1 列表加入新元素2.2 获取列表长度2.3 获取指定下标的元素2.4 获取指定…

Android App 架构 面试专题,你可能会被问到的 20 个问题

iveData 是否已经被弃用? 没有被弃用。在可以预见的未来也没有废弃的计划。 LiveData 可以使用简单的方式获取一个易于观察、状态安全的对象。虽然其缺少一些丰富的操作符&#xff0c;但是对于一些简单的 UI 业务场景已经足够。 Flow 有 LiveData 相同的功能&#xff0c;其…