探索Vue的组件世界-组件通信

news2024/12/27 17:17:01

目录

组件跨层级访问

访问外层组件

定向消息 

ref(父组件访问子组件)

依赖注入

依赖注入,vue2.0实现源码

组件封装

组件二次封装

小结


组件跨层级访问

访问外层组件

// 获取 根组件 的数据
this.$root.pri;

// 写入 根组件 的数据
this.$root.pri = 2;

// 访问 根组件 的计算属性
this.$root.sm;

// 调用 根组件 的方法
this.$root.prism();
// 获取 父组件 的数据
this.$parent.pri;

// 写入 父组件 的数据
this.$parent.pri = 2;

// 访问 父组件 的计算属性
this.$parent.sm;

// 调用 父组件 的方法
this.$parent.prism();

定向消息 

 一级一级往上找直到找到name === componentName,把消息传过去

ref(父组件访问子组件)

<base-input ref="usernameInput" />
this.$refs.usernameInput.focus();
// $ref只能在mounted生命周期钩子函数被调用之后才能使用
// $parent和$root在各个生命周期钩子函数中都可以使用

this.$parent 和this.$root会造成强耦合,不易于复用,如上图,同一个组件在不同父组件中使用,报错了。

由此,为了解决这个问题引入了依赖注入

依赖注入

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

// 根组件
export default {
    name: "s-layout",
    provide() {// 依赖注入
        return {
            fish: {
                love: "tama"        
            }    
        }
    }
}
// 直系子孙组件
export default {
    name: "s-course-tab",
    inject: ["fish"],// 接收注入的依赖
    methods: {
        say() {
            alert(this.fish.love);    
        }
    }
}

依赖注入,vue2.0实现源码

vue/inject.js at dev · vuejs/vue · GitHub

export function resolveInject(inject: any, vm: Component): ?Object {
  if (inject) {
    // inject is :any because flow is not smart enough to figure out cached
    const result = Object.create(null);
    const keys = hasSymbol ? Reflect.ownKeys(inject) : Object.keys(inject);
    for (let i = 0; i < keys.length; i++) {
      const key = keys[i];
      // #6574 in case the inject object is observed...
      if (key === "__ob__") continue;
      const provideKey = inject[key].from;
      let source = vm;
      // 开始查找注入--------------
      while (source) {
        if (source._provided && hasOwn(source._provided, provideKey)) {
          result[key] = source._provided[provideKey];
          // 找到里子组件最近的provide,结束查找注入的依赖
          break;
        }
        source = source.$parent;
      }
      // 查找结束-------------------
      if (!source) {
        if ("default" in inject[key]) {
          const provideDefault = inject[key].default;
          result[key] =
            typeof provideDefault === "function"
              ? provideDefault.call(vm)
              : provideDefault;
        } else if (process.env.NODE_ENV !== "production") {
          warn(`Injection "${key}" not found`, vm);
        }
      }
    }
    return result;
  }
}

依赖注入的优点:

  • 祖先组件不需要知道哪些后代组件使用它提供的属性
  • 后代组件不需要知道被注入的属性来自哪里

缺点:

  • 组件间的耦合较为紧密,不易重构
  • 提供的属性是非响应式(框架设计考虑)

组件封装

Element-UI二次封装

// v-bind="$attrs" v-on="$listeners" 透传,事件
<template>
  <el-input v-bind="$attrs" v-on="$listeners"></el-input>
</template>
<style scoped>
.el-input >>> .el-input__inner {
  border-top: none;
  border-left: none;
  border-right: none;
}
</style>

组件二次封装

  • 通过v-bind=“$attr”来传递父组件上的prop class和 style
  • 通过v-on="$listensers"来传递父组件上的事件监听器和事件修饰符

小结

  1. 组件跨层级访问
  2. 组件二次封装

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

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

相关文章

人机融合智能的测量、计算与评价

老子在《道德经》第二十一章写道:"道之为物,惟恍惟惚。惚兮恍兮,其中有象;恍兮惚兮,其中有物。窈兮冥兮,其中有精;其精甚真,其中有信。"&#xff08;“道”这个东西&#xff0c;没有清楚的固定实体。它是那样的恍恍惚惚啊&#xff0c;其中却有形象。它是那样的恍恍惚…

怎样才能做好企业内部wiki知识库呢?

企业内部wiki知识库是一种常用的知识管理方式。通过建立企业内部wiki知识库&#xff0c;企业可以更好的管理和共享知识&#xff0c;提高员工的工作效率和生产力。 详解如何做好企业内部wiki知识库的方法&#xff1a; 一、设计知识库架构 企业内部wiki知识库的架构设计是非常…

抖音seo源码优化/企业号搜索排名/开源搭建

什么是抖音seo&#xff1f; 抖音SEO是指通过提高在抖音平台的关键词排名&#xff0c;来获取流量、获取客户的目的。抖音的流量主要分为付费流量、推荐流量和搜索流量&#xff0c;其中搜索流量因为付费太贵、上热门太累而成为另一种进入方式1。抖音拥有庞大的用户基数&#xff…

shell命令以及运行原理,命令行解释器/bash,Linux Kernel与Shell简单理解等

引入 输入指令的过程本质上就是在输入一个字符串&#xff0c;然后指令的本质就是编译好的程序.exe与脚本。它们都是在系统的特定路径之下放着呢。然后我们所有指令最终都是要到操作系统内部去运行的&#xff0c;也就是说各种各样的指令都需要操作系统的参与。我们有各种各样的…

WordPress 如何开启多站点 含Apache和Nginx伪静态规则

WordPress 3.0以上的版本支持直接开启多站点模式,这样一来,你可以在一个后台切换多个站点进行管理。 最近打算折腾一个主题演示站,给每个主题使用独立的子站点来搭建演示,如果是Apache环境,配置就比较容易,但是倡萌使用的是 Nginx,花了大量的时间测试了N多网络上的伪静…

什么是无头浏览器?如何使用Golang实现无头浏览器截图?

前言 在Web开发中&#xff0c;有时需要对网页进行截图&#xff0c;以便进行页面预览、测试等操作。 而使用无头浏览器来实现截图功能&#xff0c;可以避免手动操作的繁琐和不稳定性。 这篇文章将介绍&#xff1a;使用Golang进行无头浏览器的截图&#xff0c;轻松实现页面预览…

苹果电脑PS Raw增效工具:Camera Raw 15中文版

Camera Raw 15是Adobe公司开发的一款用于处理RAW格式图像的插件软件&#xff0c;它可以帮助用户在Photoshop、Lightroom等软件中对RAW格式图像进行调整和优化。Camera Raw 15提供了丰富的调整工具&#xff0c;包括白平衡、曝光、色彩、锐化、噪点、透视等&#xff0c;可以让用户…

home assistant添加天气预报

先上效果图&#xff0c;大体就是这个样子 1.天气API链接 https://www.windy.com 选择页面嵌入式微件 下面是完整的HTML 代码&#xff0c;但是需要修改一下 <iframe width"1000" height"600" src"https://embed.windy.com/embed2.html?lat21.2…

【腾讯云Finops Crane集训营】利用云原生成本优化项目实现降本增效泰裤辣~

Crane 是一个基于 FinOps 的云资源分析与成本优化平台。在保证客户应用运行质量的前提下实现极致的降本。 文章目录 一、 前言&#x1f350;二、 Crane开源项目简介&#x1f34e;2.1. Crane整体框架&#x1f352;2.2. Crane主要功能&#x1f345; 三、Crane实验前期准备&#x…

PaLM 2 硬刚 GPT-4,未来还有变数

在 ChatGPT 没有出现之前&#xff0c;谷歌多年来一直是 AI first战略 &#xff0c;不出意外的话还会是领头羊&#xff0c;手握 DeepMind 和 Google Brain 两大 AI 王牌&#xff0c;再加上投资技术实力雄厚的 Anthropic&#xff0c;论资排辈都得是他。时不我与&#xff0c;被 Op…

链表--part 1--链表基础理论(概括)

文章目录 单链表双链表循环链表链表链表的定义删除节点增加节点 首先什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最…

低代码平台的分类及选择参考

目录 零、认识低代码 一、低代码平台的分类 1.1通用低代码平台 1.2垂直低代码平台 1.3开放式低代码平台 二、低代码平台的特点 三、低代码平台的优缺点对比 四、低代码平台的选择参考 为什么选择IVX&#xff1f; 五、iVX平台与其他低代码平台的区别 零、认识低代码 …

机器学习项目实战-能源利用率 Part-2(探索性数据分析)

Part-1部分的博客可见下&#xff1a; 机器学习项目实战-能源利用率 Part-1&#xff08;数据清洗&#xff09; 这部分进行的是探索性数据分析。 探索性数据分析 Exploratory Data Analysis 简单的说&#xff0c;就是画图来分析数据。 分析标签数据 data data.rename(colum…

c++ 11标准模板(STL) std::set(六)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

STL配接器(容器适配器)—— queue 的介绍使用以及模拟实现。

注意 &#xff1a; 以下所有文档都来源此网站 &#xff1a; http://cplusplus.com/ 一、queue 的介绍 queue 文档的介绍&#xff1a;https://cplusplus.com/reference/queue/queue/ 1. 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其…

将本机安装的chrome插件移至其他电脑

国内chrome应用商店默认是打不开的&#xff0c;属于绕过应用商店安装的一种办法 假设已安装插件的电脑为A电脑 待安装插件电脑为B电脑 首先在A电脑打开chrome浏览器&#xff0c;然后输入chrome://version/ 找到"个人资料路径"对应位置 个人资料路径下的Extensions目…

LabVIEWCompactRIO 开发指南22 CVT客户端通信(CCC)

LabVIEWCompactRIO 开发指南22 CVT客户端通信&#xff08;CCC&#xff09; 如果使用第3章中讨论的CVT进行进程间通信&#xff0c;请考虑使用CCC。如果已经创建了CVT标签&#xff0c;并且想在网络上发布此数据&#xff0c;CCC不失为一个简单而优雅的解决方案。它基于TCP/IP&am…

java接口与实现

文章目录 一、Java接口二、Java实现接口三、Java接口回调四、Java接口与多态五、Java接口参数六、Java接口与抽象类的比较七、Java接口的UML图总结 一、Java接口 接口是Java语言中一种重要的数据类型&#xff0c;通常使用关键字interface来定义一个接口。 接口的定义和类的定…

【22-23 春学期】人工智能基础--AI作业10-经典卷积网络

LeNet & MNIST LeNet是由Yann LeCun及其合作者于1998年开发的一种具有开创性的卷积神经网络架构。它的设计目的是识别手写数字并执行图像分类任务。MNIST是一个用于手写数字识别的大型数据库&#xff0c;常被用于训练图像处理系统。LeNet与MNIST的关系在于&#xff0c;LeNe…

二十六、搜索与图论——SPFA算法(单源最短路 + 负权边 + Bellman-Ford 时间复杂度优化)

SPFA算法主要内容 一、基本思路1、算法概念2、SPFA 算法步骤算法步骤注意事项 3、SPFA算法进行负环判断 二、Java、C语言模板实现SPFA 算法SPFA求负环 三、例题题解 一、基本思路 1、算法概念 概念&#xff1a; SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称&#xff0…