Vue3 关于 provide、inject 的用法

这篇具有很好参考价值的文章主要介绍了Vue3 关于 provide、inject 的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


一. 场景再现

  1. 先别着急考虑标题这个 api 的含义。在这里我先动手写一个比较常见的场景。
    所对应的组件内部代码比较简单,这里我就不展示了,逻辑上就是 这三个组件层层引用。
    inject provide vue3,vue,vue.js,前端,javascript
    所对应的页面效果如下:
    inject provide vue3,vue,vue.js,前端,javascript

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

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

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

二. 传递 Props

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

  2. 于是我会在 GrandFather.vue写下这样一段代码
    inject provide vue3,vue,vue.js,前端,javascript

  3. 接下来就该去 Father.vue 组件去接收这个数据了。于是我们在 Father.vue 组件定义了 props 去接收这个值。
    inject provide vue3,vue,vue.js,前端,javascript
    我们看一眼页面
    inject provide vue3,vue,vue.js,前端,javascript
    没什么问题,爸爸组件已经收到了。但是别忘了我们任务还没完成呢,我们的需求是给儿子组件使用,

  4. 于是我们又赶紧接着往下传递。
    inject provide vue3,vue,vue.js,前端,javascript

  5. 所以现在我们的 Children.vue 组件的样子就变成这个样子。
    inject provide vue3,vue,vue.js,前端,javascript
    页面效果如下:
    inject provide vue3,vue,vue.js,前端,javascript
    最终我们的 儿子组件 也确实拿到了。

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

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

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

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

三. provide 和 inject

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

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

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

  4. 你做的仅仅只需要两步:
    inject provide vue3,vue,vue.js,前端,javascript
    或许你会惊讶,就这样就行了?我明确告诉你,是的,这样就行了。

  5. 接下来最后一步,去儿子组件接收使用就大功告成了。
    inject provide vue3,vue,vue.js,前端,javascript
    我们看一下页面效果:
    inject provide vue3,vue,vue.js,前端,javascript

  6. 不仅仅数据成功拿到了,而且关键的是我们的爸爸组件是干干净净的,丝毫不影响其他地方对它的引用。
    inject provide vue3,vue,vue.js,前端,javascript

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

  8. 这时候儿子组件听到了这个消息,大喊:“我要我要!!”于是它就赶紧 inject 了一个 “message”。
    inject provide vue3,vue,vue.js,前端,javascript
    注意: 你用于接受的变量名字是随便起的,不需要你和前面保持一致。
    inject provide vue3,vue,vue.js,前端,javascript

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

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

  11. 我们测试一下,我们首先取消了爷爷组件provide 行为。
    inject provide vue3,vue,vue.js,前端,javascript
    可以看到,页面正确的显示了我们的兜底数据。
    inject provide vue3,vue,vue.js,前端,javascript

三. provide 的进阶用法

  1. provide 的作用远远不止提供字符串类型数据而已,我们在爷爷组件声明一个响应式的数据试试。
    inject provide vue3,vue,vue.js,前端,javascript

  2. 让我们看一下儿子组件是否可以正确的响应。
    inject provide vue3,vue,vue.js,前端,javascript
    可以看到,确实是可以的。

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

  4. 儿子组件真的可以自己控制吗?孩子真的长大了吗?
    inject provide vue3,vue,vue.js,前端,javascript
    我们测试一下:
    inject provide vue3,vue,vue.js,前端,javascript
    可以看到儿子组件确实是长大了(指成功 inject爷爷组件 provide 的函数)

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

四. 源码

爷爷组件代码

<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","我使用谁的?")文章来源地址https://www.toymoban.com/news/detail-742107.html

到了这里,关于Vue3 关于 provide、inject 的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【vue3】vue3的三种写法(附带provide/inject、toRefs说明、ref,reactive的区别)

    写法一(vue3的写法) toRefs定义: toRefs可以将对象(只能接收rective对象)中的属性变成响应式。 正常reactive对象数据也是响应式的,如果用toRefs解构出去会更加方便。 toRefs什么时候用? 数据量如果很多, 我们一般会用解构来简化代码, 那么在vue3 中如果使用对象的解构,

    2024年02月13日
    浏览(49)
  • Vue3的组合式API中如何使用provide/inject?

    听说 Vue 3 加入了超多酷炫的新功能,比如组合式 API 等等。今天我们就来聊聊 Vue 3 中的组合式 API,并且如何使用 provide/inject 来搞定它! 首先,我们来了解一下组合式 API 是什么。其实,组合式 API 就是一个用来构建和组合函数的工具,它能让我们的代码更加简洁、可读性更

    2024年02月11日
    浏览(44)
  • vue2.x中的provide和inject用法

    父子通信 兄弟通信 跨级通信 1、类型 2、详细 3、示例 爷组件 父组件 孙组件 对比一下前后差异:无论点击多少次,孙组件中的诞生于 year 字段永远都是1995 并不会发生变化,通过 方式1、方式2、方式4传值是可以响应的。 正是官网所提到的: provide 和 inject 绑定并不是可响应

    2024年02月05日
    浏览(47)
  • Vue3前端开发,provide和enject的基础练习,跨层级传递数据

    Vue3前端开发,provide和enject的基础练习,跨层级传递数据! 声明:provide虽然可以跨层级传递,但是依旧是需要由上向下的方向传递。根传子的方向。 这个是入口组件的内容,我们调用了一个中间组件Middle.vue。 这个是中间组件的内容,我们调用了一个三级组件Three.vue. 这个是第三

    2024年01月22日
    浏览(49)
  • VUE2中provide 和 inject用法,以及怎么做响应式数据?

    provide 和 inject, 用来实现实现跨组件之间通信. 父子/孙子组件之间任意通信. 在祖先组件中通过provide注入一个依赖,不论组件层次有多深,都可以通过inject 来访问到provide的数据. 三个组件: Home组件 - Provide组件 - Sun组件(最底层) 在provide 组件中: 在sun组件中: 这时页面上就会展示

    2024年02月16日
    浏览(35)
  • Vue 中的依赖注入,特别是 Provide 和 Inject,它们的原理、用法和示例

    Vue.js 作为一款现代的前端 JavaScript 框架,提供了诸多方便开发的特性。其中依赖注入是一个非常有用的功能,可以在组件树中传递数据和方法,并使得组件之间的耦合度更低。本文将介绍 Vue 中的依赖注入,特别是 Provide 和 Inject,它们的原理、用法和示例。 在软件开发中,

    2024年02月06日
    浏览(48)
  • 关于vue3+niginx前端部署问题

    曾经有人给我讲,所谓个人技术是死磕出来的,只有经过不断的试错和解决过程所有问题,以及不断变换思路去解决一件问题的过程,就是个人技术的成长。 最近在给自己搭建的小服务加一个bolg模块,在网上大概看了下轻量级的框架,最后使用vueQuill富文本编辑器 ,期间产

    2024年02月12日
    浏览(42)
  • 【前端技术】Vue3 01:初识 Vue.js

    Vue 可以说是非常流行了,至少在国内是这样,他是个轻量级的 JavaScript 框架,非常适合构建大型和中小型的 Web 应用程序,如果想和前端打交道,应该绕不过这个框架吧。 目录 1 Vue.js 介绍 2  IDE 选择 2.1 vscode 2.2 WebStorm 2.3 Eclipse 3  创建 Vue 应用 3.1 本地脚手架创建 ① 安装

    2024年02月02日
    浏览(64)
  • 关于 Vue3 响应式 API 以及 reactive 和 ref 的用法

    这篇文章记录一下 Vue3 响应式的内容,其中还包括了 reactive 和 ref 的用法。响应式是一种允许以声明式的方式去适应变化的编程范例,接下来我们一起看看。 Vue 框架的特点之一就是响应式。 Vue 2.x 是基于 Object.defineProperty() 方法实现响应式。但是 Object.defineProperty() 方法有一定

    2024年02月12日
    浏览(42)
  • 【vue3】关于watch与computed的用法看这个就ok

    😉博主:初映CY的前说(前端领域) ,📒本文核心:watch()与computed的使用【vue2中watch|computed概念详解】,本文将介绍在vue3中怎么使用这两者技能 【前言】vue2当中有这两个技能,那么vue3中的watch与computed是怎么用呢? 注意点:对 reactive 自身的修改则不会触发监听。 一定得注意不

    2023年04月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包