vue3.x 的provide 与 inject详细解读

news2025/3/13 4:03:56

在 Vue 3.x 中,provide 和 inject 是一对用于实现依赖注入的 API。它们允许父组件向其所有子组件(无论嵌套多深)传递数据或方法,而不需要通过 props 逐层传递。这在开发复杂组件或高阶组件时非常有用。

1. provide 的基本用法

provide 用于在父组件中提供数据或方法,供其所有子组件使用。它通常在 setup 函数中使用。

import { provide, ref } from 'vue';

export default {
  setup() {
    const message = ref('Hello from parent');

    // 提供数据
    provide('message', message);

    return {
      message
    };
  }
};

在上面的例子中,父组件通过 provide 提供了一个名为 message 的响应式数据。

2. inject 的基本用法

inject 用于在子组件中注入父组件提供的数据或方法。它通常在 setup 函数中使用。

import { inject } from 'vue';

export default {
  setup() {
    // 注入数据
    const message = inject('message');

    return {
      message
    };
  }
};

在这个例子中,子组件通过 inject 注入了父组件提供的 message 数据,并可以在模板或逻辑中使用它。

3. 默认值

inject 可以接受一个默认值,当父组件没有提供对应的数据时,子组件会使用这个默认值。

const message = inject('message', 'Default message');

如果父组件没有提供 message,子组件将使用 'Default message' 作为默认值。

4. 提供和注入方法

除了数据,provide 和 inject 也可以用于传递方法。

// 父组件
import { provide } from 'vue';

export default {
  setup() {
    const showMessage = () => {
      alert('Message from parent');
    };

    provide('showMessage', showMessage);

    return {};
  }
};

// 子组件
import { inject } from 'vue';

export default {
  setup() {
    const showMessage = inject('showMessage');

    return {
      showMessage
    };
  }
};

在子组件中,可以通过调用 showMessage 方法来触发父组件中的逻辑。

5. 响应式数据

provide 和 inject 可以结合 Vue 的响应式系统使用。如果提供的数据是响应式的(如 ref 或 reactive),那么子组件中注入的数据也会保持响应性。

// 父组件
import { provide, ref } from 'vue';

export default {
  setup() {
    const count = ref(0);

    provide('count', count);

    return {
      count
    };
  }
};

// 子组件
import { inject } from 'vue';

export default {
  setup() {
    const count = inject('count');

    return {
      count
    };
  }
};

在子组件中,count 是响应式的,子组件可以修改它,并且父组件中的 count 也会同步更新。

6. 使用 Symbol 作为 key

为了避免命名冲突,可以使用 Symbol 作为 provide 和 inject 的 key。

// 父组件
import { provide, ref } from 'vue';

const messageKey = Symbol();

export default {
  setup() {
    const message = ref('Hello from parent');

    provide(messageKey, message);

    return {
      message
    };
  }
};

// 子组件
import { inject } from 'vue';

const messageKey = Symbol();

export default {
  setup() {
    const message = inject(messageKey);

    return {
      message
    };
  }
};

7. 注意事项

  • provide 和 inject 主要用于高阶组件或库的开发,普通应用开发中应优先使用 props 和 emit

  • provide 和 inject 不是响应式的,除非你提供的是响应式对象(如 ref 或 reactive)。

  • inject 只能在 setup 函数或 functional 组件中使用。

8. 总结

provide 和 inject 是 Vue 3.x 中用于依赖注入的强大工具,特别适合在复杂组件树中传递数据或方法。通过它们,可以避免繁琐的 props 传递,使代码更加简洁和可维护。

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

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

相关文章

C#控制台大小Console.SetWindowSize函数失效解决

在使用C#修改控制台大小相关API会失效. 由于VS将控制台由命令提示符变成了终端,因此在设置大小时会出现问题 测试代码: Console.SetWindowSize(100, 50);

spring boot 对接aws 的S3 服务,实现上传和查询

1.aws S3介绍 AWS S3(Amazon Simple Storage Service)是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是AWS S3的一些主要特点和功能: 1.1. 对象存储 对象存储模型:S3使用…

25/2/16 <算法笔记> DirectPose

DirectPose 是一种直接从图像中预测物体的 6DoF(位姿:6 Degrees of Freedom)姿态 的方法,包括平移和平面旋转。它在目标检测、机器人视觉、增强现实(AR)和自动驾驶等领域中具有广泛应用。相比于传统的位姿估…

数据结构-8.Java. 七大排序算法(下篇)

本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 下篇主要实现最后一种排序算法: 归并排序。同时把中篇剩下的快排非递归实现补上. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是…

DeepSeek私有化部署+JAVA通过API调用离线大模型问答

在当今快速发展的数字化时代,企业对于高效、灵活的技术解决方案需求日益增长。DeepSeek作为一款领先的智能搜索与分析平台,凭借其强大的数据处理能力和精准的搜索结果,已经成为众多企业提升运营效率的得力助手。为了更好地满足企业对数据安全…

【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版

针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接:https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录,保持与游戏主程序同目录下。

内容中台驱动企业数字化内容管理高效协同架构

内容概要 在数字化转型加速的背景下,企业对内容管理的需求从单一存储向全链路协同演进。内容中台作为核心支撑架构,通过统一的内容资源池与智能化管理工具,重塑了内容生产、存储、分发及迭代的流程。其核心价值在于打破部门壁垒,…

【第14章:神经符号集成与可解释AI—14.4 神经符号集成与可解释AI的未来发展趋势与挑战】

想象一下,如果AI既能像人类一样直觉感知(比如一眼认出街角的咖啡店),又能像数学家一样逻辑推理(比如计算最优路线避开拥堵),这个世界会变成什么样?这种“双脑协同”正是神经符号集成技术的终极目标。 但现实是,当前99%的AI系统要么只会“死记硬背”数据(如深度学习模…

[Spring Boot] Expense API 实现

[Spring Boot] Expense API 实现 项目地址:expense-api 项目简介 最近跟着视频做的一个 spring boot 的项目,包含了比较简单的记账功能的实现(只限 API 部分),具体实现的功能有: 记账(expen…

设置默认构建变体 Build Variant

Android Studio在打开项目时有时会把我设置好的build Variant改为默认的变体,没注意的话可能打完包才发现打错了,浪费时间。因此,有必要通过代码设置一个我想要的默认变体。 代码其实很简单,只要在变体下面加上isDefault true即可…

【大模型】DeepSeek使用与原理解析:从V3到R1

文章目录 一、引言二、使用与测评1.7大R1使用技巧2.官网实测 发展历程三、Deepseek MoE:专家负载均衡 (2024年1月)四、GRPO:群体相对策略优化(DeepSeek-Math,2024年4月)五、三代注意力&#xff…

DAY04 Object、Date类、DateFormat类、Calendar类、Math类、System类

学习目标 能够说出Object类的特点是所有类的祖宗类,任意的一个类都直接或者间接的继承了Object类,都可以使用Object类中的方法Animal extends Object:直接继承Cat extends Animal:间接继承 能够重写Object类的toString方法altinsert,选择toString 能够重写Object类的equals方法…

图像生成GAN和风格迁移

文章目录 摘要abstract1.生成对抗网络 GAN1.1 算法步骤 2.风格迁移2.1 损失函数2.2 论文阅读2.2.1 简介2.2.2 方法2.2.3 实验2.2.4 结论 3.总结 摘要 本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器…

golangAPI调用deepseek

目录 1.deepseek官方API调用文档1.访问格式2.curl组装 2.go代码1. config 配置2.模型相关3.错误处理4.deepseekAPI接口实现5. 调用使用 3.响应实例 1.deepseek官方API调用文档 1.访问格式 现在我们来解析这个curl 2.curl组装 // 这是请求头要加的参数-H "Content-Type:…

【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】

一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…

LangChain大模型应用开发:提示词工程应用与实践

介绍 大家好,博主又来给大家分享知识了。今天给大家分享的内容是LangChain提示词工程应用与实践。 在如今火热的大语言模型应用领域里,LangChain可是一个相当强大且实用的工具。而其中的提示词(Prompt),更是我们与语言模型进行有效沟通的关…

2025 N1CTF crypto 复现

近一个月都没有学习了,一些比赛也没有打,很惭愧自己还是处在刚放假时的水平啊,马上开学了,抓紧做一些训练来康复。 CheckIn import os from Crypto.Util.number import * from secret import FLAGp, q getPrime(512), getPrime…

Windows Defender Control--禁用Windows安全中心

Windows Defender Control--禁用Windows安全中心 链接:https://pan.xunlei.com/s/VOJDuy2ZEqswU4sEgf12JthZA1?pwdtre6#

mount 出现 2038 问题

在 linux 上挂载 ext4 文件系统时出现了 2038 年问题,如下: [ 236.388500] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ 236.388560] ext4 filesystem being mounted at /root/tmp supports timestamps until 2…