iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3中的provide、inject的用法
  • 185
分享到

Vue3中的provide、inject的用法

Vue3provideinject使用Vue3provideinject 2023-03-06 08:03:21 185人浏览 独家记忆
摘要

目录一. 场景再现二. 传递 Props三. provide 和 inject四. provide 的进阶用法五. 源码六. 思考题前言: 在前端项目中牵扯的最多的莫过于组件之间的传

前言:前端项目中牵扯的最多的莫过于组件之间的传值了,除了最最常用的 propsemit,其实在 Vue 中还额外提供了另外几种方法。今天分享一种组件之间通信的方法。

一. 场景再现

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

image.png

所对应的页面效果如下:

image.png

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

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

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

二. 传递 Props

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

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

image.png

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

image.png

我们看一眼页面

image.png

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

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

image.png

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

image.png

页面效果如下:

image.png

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

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

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

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

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

三. provide 和 inject

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

image.png

image.png

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

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

image.png

你做的仅仅只需要两步:

image.png

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

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

image.png

我们看一下页面效果:

image.png

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

image.png

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

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

image.png

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

image.png

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

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

image.png

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

image.png

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

image.png

四. provide 的进阶用法

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

image.png

让我们看一下儿子组件是否可以正确的响应。

1.gif

可以看到,确实是可以的。

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

image.png

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

image.png

我们测试一下:

2.gif

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

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

image.png

五. 源码

爷爷组件代码

<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使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue3中的provide、inject的用法

本文链接: https://www.lsjlt.com/news/198524.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3中的provide、inject的用法
    目录一. 场景再现二. 传递 Props三. provide 和 inject四. provide 的进阶用法五. 源码六. 思考题前言: 在前端项目中牵扯的最多的莫过于组件之间的传...
    99+
    2023-03-06
    Vue3 provide inject使用 Vue3 provide inject
  • vue3中provide和inject的使用
    1.provide 和 inject 的讲解 provide和inject可以实现嵌套组件之间进行传递数据。 这两个函数都是在setup函数中使用的。 父级组件使用provide向...
    99+
    2024-04-02
  • Vue3中的provide、inject怎么使用
    一. 场景再现先别着急考虑标题这个 api 的含义。在这里我先动手写一个比较常见的场景。所对应的组件内部代码比较简单,这里我就不展示了,逻辑上就是 这三个组件层层引用。所对应的页面效果如下:如上图,这是一个在项目中很常见的一个场景,三层嵌套...
    99+
    2023-05-14
    Vue3 provide inject
  • Vue3的provide/inject怎么使用
    本文小编为大家详细介绍“Vue3的provide/inject怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3的provide/inject怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思...
    99+
    2024-04-02
  • vue3中 provide 和 inject 用法及原理
    前言: 在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或...
    99+
    2024-04-02
  • vue3中provide和inject怎么用
    这篇文章将为大家详细讲解有关vue3中provide和inject怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。provide 和 inject 的讲解provide和inject可以实现嵌套组件之...
    99+
    2023-06-20
  • vue3中provide和inject怎么使用
    本篇内容主要讲解“vue3中provide和inject怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue3中provide和inject怎么使用”吧!前言:在父子组件传递数据时,通常...
    99+
    2023-06-21
  • vue2和vue3中provide/inject的基本用法示例
    目录前言vue2基本用法:1.provide2.inject如何成为响应式?1.方法一:函数方法2.方法二:传递thisvue3的基本用法:总结前言 昨天看一个项目代码看到了prov...
    99+
    2023-05-17
    vue中provideinject vue中provide的用法 vue中的inject
  • Vue3中Provide / Inject的实现原理分享
    目录前言原型和原型链的知识回顾使用 Provideprovide API实现原理组件实例对象初始化时provides属性的处理使用 Injectinject API实现原理provi...
    99+
    2024-04-02
  • Vue3中Provide/Inject的实现原理是什么
    本文小编为大家详细介绍“Vue3中Provide/Inject的实现原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3中Provide/Inject的实现原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-29
  • Vue3插件中怎么使用Provide和Inject
    今天小编给大家分享一下Vue3插件中怎么使用Provide和Inject的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。为什么...
    99+
    2023-07-04
  • Vue3中Provide和Inject的实现原理是什么
    这篇文章主要介绍了Vue3中Provide和Inject的实现原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3中Provide和Inject的实现原理是什么文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-29
  • 怎么用 Provide 和 Inject 做Vue3插件
    这篇文章主要介绍“怎么用 Provide 和 Inject 做Vue3插件”,在日常操作中,相信很多人在怎么用 Provide 和 Inject 做Vue3插件问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • Vue 中 provide和inject的使用
    目录前言Vue中如何使用provide和inject在 Vue 中使用注入访问父数据前言 在Vue中我们可以很方便的通过父组件往子组件传递属性,Props是我们将数据传递到子组件的主...
    99+
    2022-11-13
    Vue 中 provide的使用 Vue 中inject的使用
  • vue2.0/3.0中provide和inject的用法示例
    目录1、provide/inject有什么用?2、provide/inject使用方式具体用法:vue3.0用法总结1、provide/inject有什么用? 常用的父子组件通信方...
    99+
    2024-04-02
  • Vue的provide/inject如何用
    这篇文章主要讲解了“Vue的provide/inject如何用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue的provide/inject如何用”吧!...
    99+
    2024-04-02
  • vue2.x,vue3.x使用provide/inject注入的区别说明
    目录vue2.x,vue3.x使用provide/inject注入区别provide/inject介绍vue2.x用法vue3.x用法vue的依赖注入问题总结vue2.x,vue3....
    99+
    2023-05-17
    vue3使用provide注入 vue3使用inject注入 vue2使用provide注入 vue2使用inject注入
  • Vue中的provide和inject怎么使用
    今天小编给大家分享一下Vue中的provide和inject怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在vue2...
    99+
    2023-07-06
  • Vue3全局组件通信之provide/inject怎么使用
    本篇内容介绍了“Vue3全局组件通信之provide/inject怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、前言顾名思义,爷...
    99+
    2023-07-06
  • 一文聊聊Vue中provide和inject的使用方法
    Vue中如何使用provide与inject?下面本篇文章就来给大家介绍一下Vue中provide和inject的使用方法,希望对大家有所帮助!在vue2.0里面provide与inject是以选项式(配置)API的方式在组件中进行使用的,...
    99+
    2023-05-14
    Vue javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作