Vue3通透教程【十】跨级组件通讯—依赖注入

news2024/11/18 9:45:32

文章目录

  • 🌟 写在前面
  • 🌟 provide函数
  • 🌟 inject 函数
  • 🌟 跨组件通讯
  • 🌟 写在最后


🌟 写在前面

专栏介绍:
凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选型最多的框架,凉哥之前在文章中也提到过就是 Vue 框架之所以火起来的原因,和 Vue 框架相比其他框架的巨大优势,有兴趣的伙伴可以看一下 Vue框架背后的故事、尤大大对前端生态是这样看的,随着 Vue 框架不断的被认可,现如今的 Vue 框架已经是前端工程师必备的技能了,记得尤大大开发 Vue 的初衷,为了让自己的开发工作更加便捷,也希望这个框架能让更多人的开发工作变得轻松;现如今 Vue 框架做到了,尤大大做到了,当然在 20 年的 9 月 18 日,Vue 又向前端同僚们报告了一次大的突破 Vue3.0 版本正式发布!如今已经过去了两年多的时间,更多的公司选择了Vue3技术,所以凉哥也在这个时候为大家出这份专栏,本专栏将帮助大家掌握Vue3+TS技术,提升自己竞争力!访问链接订阅 👉 Vue3通透教程【从零到一】,订阅后联系作者加入专属社群!

温故知新:
上篇文章中我们我们学会了通过definePropsdefineEmits两个函数来实现我们父子组件的通讯,其实在我们的日常开发中我们往往组件中不仅仅是父子关系的需要通讯比如爷孙关系的组件,甚至跨好级的组件进行通讯我们该如何做呢?这篇文章就来带领大家实现跨级组件通讯;让我们 let’s coding!

下面两个函数,引用的是官方文档的介绍,可能你不太明白什么意思,没关系,简单的了解一下,然后看一下我们下面的综合小案例你就能够完全明白是什么了!


🌟 provide函数

provide函数提供一个值,可以被后代组件注入。provide() 接受两个参数:第一个参数是要注入的 key,可以是一个字符串或者一个 symbol,第二个参数是要注入的值。与注册生命周期钩子的 API 类似,provide() 必须在组件的 setup() 阶段同步调用。我们来看一下用法;

provide函数既可以提供一个要注入的变量,也可以是提供一个要注入的方法;

<script setup>
import { provide, ref } from 'vue';
import son from './son.vue'

let num = ref(0)

const fun = () => {
    console.log('888')
}

provide('num', num)//变量
provide('chage', fun)//方法
</script> 

🌟 inject 函数

注入一个由祖先组件或整个应用 (通过 app.provide()) 提供的值。第一个参数是注入的 key。Vue 会遍历父组件链,通过匹配 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会“覆盖”链上更远的组件所提供的值。如果没有能通过 key 匹配到值,inject() 将返回 undefined,除非提供了一个默认值。第二个参数是可选的,即在没有匹配到 key 时使用的默认值。它也可以是一个工厂函数,用来返回某些创建起来比较复杂的值。如果默认值本身就是一个函数,那么你必须将 false 作为第三个参数传入,表明这个函数就是默认值,而不是一个工厂函数。与注册生命周期钩子的 API 类似,inject() 必须在组件的 setup() 阶段同步调用。

inject 函数既可以将上级组件链中通过 provide 函数提供的值进行注入,注入后可以使用可以是变量可以是方法的调用;

<script setup>
import { inject } from 'vue';
let num = inject('num')
const fun = inject('chage')
fun()
</script>

🌟 跨组件通讯

上面我们看到了实现跨组件通讯的 provide、inject 两个函数的基本使用和概念,那你可能对上面的概念还是懵的,没有关系,我们这就通过一个综合的案例来串联一下;首先我们还是以点赞功能为例;首先呢我会创建三个盒子分别为 盒子=》子盒子=》孙子盒子;

1)首先将初始化赞数数量0传递给孙子(跨级向子级传递数据);
2)孙子级中进行接收数据并展示,而且要通过孙子级的按钮来改变顶级的数据;(跨级向上级传递数据);

//最高层级app.vue
<template>
    <div style="width: 400px;height: 400px; background: aquamarine;">
        <p>高级</p>
        <son></son>
    </div>
</template>
<script setup>
import { provide, ref } from 'vue';
import son from './son.vue'

let num = ref(0)

const fun = (val) => {
    num.value += val
}
provide('num', num)//变量
provide('chage', fun)//方法
</script> 
//中级son.vue
<template>
    <div style="width: 300px;height: 300px; background: pink;">
        中级
        <grandson></grandson>
    </div>
</template>

<script setup>
import grandson from './grandson.vue'
</script>
//最低级grandson.vue
<template>
    <div style="width: 200px;height: 200px; background: bisque;">
        低级<br />
        总赞数{{ num }}
        <button @click="zan">+10</button>
    </div>
</template>
<script setup>
import { inject } from 'vue';
let num = inject('num')
const fun = inject('chage')
const zan = () => {
    fun(10)
}
</script>

在这里插入图片描述


🌟 写在最后

相信你通过上面的一个小案例掌握了跨级组件通讯了吧;通过两个函数将最高层的数据传给最底层,有通过点击最底层的按钮触发了最高层的方法改变了数据,我们可以从最底层直接修改数据嘛?不行的,只有谁定义的谁来修改,赶快来动手试试看吧!各位小伙伴让我们 let’s coding!

本期推荐

在这里插入图片描述

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

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

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

相关文章

java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener的一个独特解决方法

除了网上所说的各种类型的解决方案&#xff0c;还有一种解决方案。 1、在pom.xml中添加一句 <packaging>war</packaging> 2、重新配置tomcat&#xff0c;选择war 3、确保web的路径是对的 file-->project structure 如果3处标红了 改为web文件夹的正确路径即可…

html网站video标签blob视频如何下载

在淘宝或tdtu知乎等有时想下载里面的视频资源&#xff0c;看了一下视频标签里的video不是MP4格式url,而是bloburl的方式。 是blob:https并不是一种协议&#xff0c;而是html5中blob对象在赋给video标签后生成的一串标记&#xff0c;blob对象对象包含的数据&#xff0c;浏览器内…

v-model的双向数据绑定实现原理(附:案例和项目实例)

一. 前言。 相信对使用vue框架的童靴来说&#xff0c;v-model的使用都能信手沾来&#xff0c;熟悉的不能再熟悉&#xff0c;也都知道v-model其实是个语法糖。不过其究竟是怎么实现的双向数据绑定&#xff0c;很大一部分童靴还是心存疑虑。本文就根据最简单的案例和基于实际项目…

Npm link的作用与使用

一、为什么要用Npm link 库包在开发或迭代后&#xff0c;不适合发布到线上进行调试&#xff08;过程繁琐且会导致版本号膨胀&#xff09; 二、Npm link工作原理 npm link 可以帮助我们模拟包安装后的状态&#xff0c;它会在系统中做一个快捷方式映射&#xff0c;让本地的包就…

前端实战|React18项目启动——pc端极客园项目前置准备

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac

web前端作业--响应式美食菜谱网页设计(HTML+CSS+JavaScript+)实现

原始HTMLCSSJS页面设计, web大学生网页设计作业源码&#xff0c;这是一个不错的美食菜谱网页设计制作&#xff0c;非常适合初学者学习使用。 网页实现截图&#xff1a;文末获取源码 网站首页&#xff1a; 菜谱&#xff1a; 美食达人&#xff1a; 手机版效果&#xff1a; 主要…

echarts如何画地图

前情提要 用echarts画地图的方式有两种 通过真实的地图来画(百度地图、google地图、或者其它某种地图软件)去拿到某块区域的json文件来画第一种方式,可以前往 https://blog.csdn.net/glorydx/article/details/127656301查看具体如何实现 echarts 获取json文件来画地图 如…

Web of science简单使用

下面本人以使用经历简单介绍下该数据库使用&#xff0c;鉴于登录地址/学校端口等原因&#xff0c;页面信息会有出入&#xff0c;有不足之处还望大家多多补充哈&#xff08;o^o&#xff09;&#xff01; 一&#xff0e;登录方式 1.高校官网&#xff08;内网&#xff09;-图书馆…

史上无敌的超级详细的Node Js 环境搭建步骤

今日分享内容 一、Node Js 环境搭建 1、Node.js是什么&#xff1f; 2、npm是什么&#xff1f; 3、环境搭建步骤: 二、Element简介 一、Node Js 环境搭建 1、Node.js是什么&#xff1f; Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]。 Node.js使用了一个事件驱…

前端学习之HTML

目录 1. 什么是HTML&#xff1f; 2. HTML专业的开发工具有哪些&#xff1f; 3. 是谁制定了HTML? 4. HTML的简单特性 5. 基本标签的介绍 6. 表格 7. 表格中单元格的合并 8. 背景颜色和背景图片 9. 图片 10. 超链接 11.列表 12. Form表单*** 1. 什么是HTML&#xff1f…

vue3版本网页小游戏

目录 1.前言 2.实现过程 2.1目录 2.2文件介绍 3.核心逻辑分步骤详解 4.总结 1.前言 最近火爆全网的羊了个羊小程序&#xff0c;背景是根据官方介绍&#xff0c;“羊了个羊”是一款闯关消除小游戏&#xff0c;通关率不到0.1%。主要玩法为重叠的各类方块&#xff0c;需要在…

CSS选择器(nth-child)

:nth-child()这个选择符括号内可以写/- an b &#xff08;a&#xff0c;b均为整数&#xff09;或者关键字 因为工作中有遇到要隐藏列表第三个子元素之后的所有子元素&#xff0c;所以有用到这个选择器&#xff0c;记录一下 (1) nth-child(a) 当括号里只写一个数字&#xff…

元素垂直居中的五种方式

元素内容垂直居中 本文介绍&#xff1a; 元素标签内的内容垂直居中有两种思路&#xff0c; 第一种思路是将元素内容利用行高或者内边距padding属性设置 第二种思路是子盒子在父盒子中垂直居中&#xff0c;利用flex布局或者position定位方式 五种方式实现元素内容垂直居中第一种…

解决echarts报错Cannot read properties of null (reading ‘getAttribute‘)

前言 最近在写 echarts 的时候碰到了这么一个报错&#xff0c;如下图。造成报错的原因是因为 echarts 的图形容器还未生成就对其进行了初始化&#xff0c;下面几种方法是经本人自测最有效的解决方案。 报错截图 解决方案&#xff1a; 1. this.$nextTick 该方法思路是将回调延迟…

Vue|样式绑定

class 与 style 是 HTML 元素的属性&#xff0c;用于设置元素的样式&#xff0c;我们可以用 v-bind 来设置样式属性。Vue.js v-bind 在处理 class 和 style 时&#xff0c; 专门增强了它。表达式的结果类型除了字符串之外&#xff0c;还可以是对象或数组。 文末名片获取源码 精…

【vue 组件化开发 一 】组件基本使用、全局和局部组件、父组件和子组件的区别

目录 前言&#xff1a; 完整内容请关注&#xff1a; 一、组件的基本使用 二、全局组件和局部组件 全局注册&#xff0c;通过 Vue.component 局部注册&#xff0c;通过 components:{} 全局组件 局部组件 三、父组件和子组件的区别 前言&#xff1a; 完整内容请关注&am…

vue2中使用axios,以及axios拦截器的配置

目录 一、vue2项目中如何实现异步请求 1、axios&#xff1a;是一个基于Promise的网络请求库。既可以在node.js&#xff08;服务器端&#xff09;使用&#xff0c;也可以在浏览器端使用 2、vue中的使用方法 ​ &#xff08;2&#xff09;引用方法&#xff1a; ​ A、原生的…

HTML侧边导航栏

HTML侧边导航栏 简介&#xff1a;本文用最简洁的语言&#xff0c;来教会读者&#xff0c;如果用htmlcss来制作&#xff0c;侧边导航栏&#xff0c;本案例以手机商城中的部分为例子来制作。 第一步&#xff1a;构建框架 <body><!-- 首先确定导航栏中的内容 每个内容…

【vue 项目】el-upload 上传文件以及回显照片和下载文件

本次需求是上传多种固定格式的文件&#xff0c;且回显的时候&#xff0c;图片可以正常显示&#xff0c;文件可以进行下载 主要采用element的el-upload组件实现 1、文件上传 先看下&#xff0c;上传文件效果图 点击上传将文件放到网页&#xff0c;还有一个点击确定的按钮再上传…

猿创征文|【Typescript入门】常用数据类型(3)

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…