当前位置:首页 > 文章列表 > 文章 > 前端 > Vue3中的provide、inject怎么使用

Vue3中的provide、inject怎么使用

来源:亿速云 2024-04-04 14:24:27 0浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Vue3中的provide、inject怎么使用》,聊聊,我们一起来看看吧!

一. 场景再现

先别着急考虑标题这个 api 的含义。在这里我先动手写一个比较常见的场景。
所对应的组件内部代码比较简单,这里我就不展示了,逻辑上就是 这三个组件层层引用。

Vue3中的provide、inject怎么使用

所对应的页面效果如下:

Vue3中的provide、inject怎么使用

如上图,这是一个在项目中很常见的一个场景,三层嵌套的组件。(其实还有深层次的嵌套,目前我们拿三层嵌套举例足矣)

ok,你现在的需求是:在爷爷组件内需要提供一个字符串数据 “韩振方” 去提供给 儿子组件使用。

聪明的你肯定想到了 props,废话不多说,我们直接上手。

二. 传递 Props

“我以为多高深呢,这不就是数据父传子的场景吗?我直接传递 props 去完成这个需求。”

于是我会在 GrandFather.vue写下这样一段代码

Vue3中的provide、inject怎么使用

接下来就该去 Father.vue 组件去接收这个数据了。于是我们在 Father.vue 组件定义了 props 去接收这个值。

Vue3中的provide、inject怎么使用

我们看一眼页面

Vue3中的provide、inject怎么使用

没什么问题,爸爸组件已经收到了。但是别忘了我们任务还没完成呢,我们的需求是给儿子组件使用,

于是我们又赶紧接着往下传递。

Vue3中的provide、inject怎么使用

所以现在我们的 Children.vue 组件的样子就变成这个样子。

Vue3中的provide、inject怎么使用

页面效果如下:

Vue3中的provide、inject怎么使用

最终我们的 儿子组件 也确实拿到了。

写到这里你发现了一些不太对劲的地方吗?????

其实我们的爸爸组件是完全不需要知道这些属性的,它仅仅只是充当了一个传话筒。如果这个组件单纯是这一个使用场景还好,但是一旦我们想要在第二个地方复用爸爸组件的时候,我们会发现问题就来了。我们必须给这个爸爸组件提供一个叫做 message1props,但是实际上这个 message1 并不是一个爸爸组件内部自己使用的一个属性。

写到这里你发现了,仅仅只多传递了一层,就导致组件的复用性变得很差。这还是仅仅只嵌套了三层的场景,一旦到了第四层,你会发现事情逐渐开始变得棘手起来了,好像 props 并不是一个好的选择了。

想到这里你会开始思考,有没有更好的解决方法呢?你别说,还真有,那就是我们今天的主角,provideinject

三. provide 和 inject

首先不要死记硬背 api 的名字,作者起名字肯定都是有原因的。在很多情况下我们通过先看这两个单词的意思。

Vue3中的provide、inject怎么使用

Vue3中的provide、inject怎么使用

单从这两个单词的含义就大概能猜出个大概的意思,一个是提供某个值,另一个是去注册接收这个值。

那么问题就引出来了,我们怎么正确的使用这两个 api 呢?其实很简单,让我们回到爷爷组件,还原他最初的模样。

Vue3中的provide、inject怎么使用

你做的仅仅只需要两步:

Vue3中的provide、inject怎么使用

或许你会惊讶,就这样就行了?我明确告诉你,是的,这样就行了。

接下来最后一步,去儿子组件接收使用就大功告成了。

Vue3中的provide、inject怎么使用

我们看一下页面效果:

Vue3中的provide、inject怎么使用

不仅仅数据成功拿到了,而且关键的是我们的爸爸组件是干干净净的,丝毫不影响其他地方对它的引用。

Vue3中的provide、inject怎么使用

我们再回过头讲解 provide 的用法。provide 接受两个参数。第一个参数需要是一个独一无二的标识(不允许和组件内部的变量重名),第二个参数就是准备传递的值。
你也可以这样理解,现在爷爷组件拿着一个喇叭在喊????:“谁要‘韩振方’,谁要‘韩振方’,价格便宜,仅仅需要一个‘message’”。

这时候儿子组件听到了这个消息,大喊:“我要我要!!”于是它就赶紧 inject 了一个 “message”。

Vue3中的provide、inject怎么使用

注意: 你用于接受的变量名字是随便起的,不需要你和前面保持一致。

Vue3中的provide、inject怎么使用

爸爸组件丝毫不想要,所以它就压根不需要 inject

并且 inject 还可以允许你有个兜底的行为。什么意思? 假设这个儿子组件在别的地方也需要复用,但是它的爷爷组件或者它压根就没有爷爷组件,那么第二个参数将作为 suibian 的默认值。

Vue3中的provide、inject怎么使用

我们测试一下,我们首先取消了爷爷组件provide 行为。

Vue3中的provide、inject怎么使用

可以看到,页面正确的显示了我们的兜底数据。

Vue3中的provide、inject怎么使用

四. provide 的进阶用法

provide 的作用远远不止提供字符串类型数据而已,我们在爷爷组件声明一个响应式的数据试试。

Vue3中的provide、inject怎么使用

现在儿子组件长大了,它说我自己也想控制数字的增长,可以吗?爷爷组件是很宠孙子的,于是又提供了一个方法给孙子使用。

Vue3中的provide、inject怎么使用

儿子组件真的可以自己控制吗?孩子真的长大了吗?

Vue3中的provide、inject怎么使用

可以看到儿子组件确实是长大了(指成功 inject爷爷组件 provide 的函数)

千万不要转头就忘,第二个参数是我们的兜底行为。如果爷爷没提供函数,我就自己使用一个没有任何行为的箭头函数。仅此而已。

Vue3中的provide、inject怎么使用

五. 源码

爷爷组件代码

<script lang="ts" setup>
// 这是爷爷组件
import { ref } from "vue";
import { provide } from "vue";

import Father from "./Father.vue";

const count = ref<number>(0);
function add() {
  count.value = count.value + 1;
}

provide("message", count);
provide("messageAdd", add); //我把 add 也同时提供给儿子组件
</script>
<template>
  <div class="w-full h-[300px] bg-[black]">
    <span class="text-white text-[20px]">爷爷组件</span>
    <button @click="add">message+1</button>
    <Father />
  </div>
</template>

父亲组件代码

<script lang="ts" setup>
// 这是父亲组件
import Children from "./Children.vue";
</script>
<template>
  <div class="w-[70%] h-[270px] bg-[pink]">
    <span class="text-[black] text-[20px]">爸爸组件</span>
    <span class="text-[black] text-[15px]"></span>
    <Children />
  </div>
</template>

儿子组件代码

<script lang="ts" setup>
// 这是儿子组件

import { inject } from "vue";

const suibian = inject("message", "假如爷爷没提供没有的话就用我");
const add = inject("messageAdd", () => {});
</script>
<template>
  <div class="w-[70%] h-[230px] bg-[white]">
    <span class="text-[black] text-[20px]">儿子组件</span>
    <span class="text-[black] text-[10px]">{{ suibian }}</span>
    <button @click="add">长大了,我自己+1</button>
  </div>
</template>

六. 思考题

如果我现在爷爷组件父亲组件同时提供了一个相同的关键词的值,儿子组件最后会使用谁的呢?

GrandFather.vue: => provide("message","爷爷组件提供的");
Father.vue: =>provide("message","父亲组件提供的")

Children.vue:=> inject("message","我使用谁的?")

今天关于《Vue3中的provide、inject怎么使用》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于Vue3,provide,inject的内容请关注golang学习网公众号!

版本声明
本文转载于:亿速云 如有侵犯,请联系study_golang@163.com删除
大模型中常用的注意力机制GQA详解以及Pytorch代码实现大模型中常用的注意力机制GQA详解以及Pytorch代码实现
上一篇
大模型中常用的注意力机制GQA详解以及Pytorch代码实现
苹果iPhone SE 4渲染图曝光,2025年或成全面屏时代新起点
下一篇
苹果iPhone SE 4渲染图曝光,2025年或成全面屏时代新起点
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    192次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    193次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    191次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    198次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    213次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码