当前位置: 首页 > news >正文

Vue3中provide和inject的用法示例

在 Vue3 中,provide 和 inject 用于实现跨层级组件通信。以下是一个简单的示例:

1. 父组件 (祖先组件) - 提供数据

javascript

复制

// ParentComponent.vue
import { provide, ref, reactive } from 'vue';export default {setup() {// 提供静态数据provide('message', 'Hello from Parent!');// 提供响应式数据const count = ref(0);provide('count', count);// 提供对象和方法const user = reactive({name: 'Alice',age: 25});const updateUser = () => {user.age++;};provide('userData', {user,updateUser});return { count };}
};

2. 子组件 (后代组件) - 注入数据

javascript

复制

// ChildComponent.vue
import { inject } from 'vue';export default {setup() {// 注入基本类型(带默认值)const message = inject('message', 'Default message');// 注入响应式数据const count = inject('count');// 注入对象和方法const { user, updateUser } = inject('userData');// 修改响应式数据const increment = () => {count.value++;};return {message,count,user,updateUser,increment};}
};

3. 模板使用示例

html

复制

<!-- ChildComponent.vue 模板部分 -->
<template><div><h3>Child Component</h3><p>Message: {{ message }}</p><p>Count: {{ count }}</p><p>User: {{ user.name }} ({{ user.age }})</p><button @click="increment">Increment Count</button><button @click="updateUser">Update User Age</button></div>
</template>

运行 HTML

关键点说明:

  1. 响应式数据:使用 ref/reactive 创建响应式数据,注入后依然保持响应性

  2. 默认值inject('key', defaultValue) 第二个参数为默认值

  3. 类型支持:可以注入任意类型(基本类型、对象、函数等)

  4. 代码组织:推荐使用 Symbol 作为 key 避免命名冲突(适用于大型项目)

符号键示例(可选)

javascript

复制

// keys.js
export const MESSAGE_KEY = Symbol('message');
export const COUNT_KEY = Symbol('count');// 父组件
import { MESSAGE_KEY, COUNT_KEY } from './keys';
provide(MESSAGE_KEY, 'Hello World');// 子组件
const message = inject(MESSAGE_KEY);

这个模式特别适合以下场景:

  • 主题/样式配置

  • 全局状态管理(简单场景)

  • 多层嵌套组件通信

  • 共享工具函数/实例

注意:对于复杂应用,建议使用 Pinia 进行状态管理,但对于简单的组件层级通信,provide/inject 更加轻量。

http://www.xdnf.cn/news/14635.html

相关文章:

  • opencv函数展示3
  • Git LFS 学习笔记:原理、配置、实践与心路历程
  • 直播人脸美型核心技术详解:卷积神经网络与图像增强在美颜SDK中的应用
  • pdfjs库使用记录1
  • Web3区块链网络中数据隐私安全性探讨
  • 深度解析生成对抗网络:原理、应用与未来趋势
  • #systemverilog# 进程控制问题#(八)关于#0 问题的使用(三)
  • 全志H5,NanopiKP1lus移植QT5.12记录
  • 如何在 Electron 应用中安全地进行主进程与渲染器进程通信
  • 通过特定协议拉起 electron 应用
  • electron 渲染进程按钮创建新window,报BrowserWindow is not a constructor错误;
  • 嵌入式设备网络的动态ID分配机制实现
  • 极狐GitLab 用户 API 速率限制如何设置?
  • CenterTrack
  • DNS解析失败怎么解决?
  • 【Spring Boot 源码学习】深入 ConfigurableEnvironment 的初始化过程
  • 论文阅读笔记——Mixtral of Experts
  • 中级社会工作者考试精选练习题
  • 深度学习-全连接神经网络-1
  • C++代码优化
  • 梯度下降代码
  • fatdds:传输层SHM和DATA-SHARING的区别
  • 数据结构|基数排序及八个排序总结
  • Python爬虫入门
  • 使用veaury,在vue项目中运行react组件
  • 汉诺塔专题:P1760 通天之汉诺塔 题解 + Problem D: 汉诺塔 题解
  • AI写程序: 多线程网络扫描网段ip工具
  • STM32使用rand()生成随机数并显示波形
  • 【最后203篇系列】028 FastAPI的后台任务处理
  • JVM之经典垃圾回收器