<Vue>使用依赖注入的方式共享数据

什么是vue依赖注入?

Vue是一个用于构建用户界面的渐进式框架。

它提供了一种简单而灵活的方式来管理组件之间的数据流,即依赖注入(Dependency Injection,DI)。

依赖注入是一种设计模式,它允许一个组件从另一个组件获取它所依赖的数据或服务,而不需要自己创建或管理它们。这样可以降低组件之间的耦合度,提高代码的可维护性和可测试性。

依赖注入示意图

在这里插入图片描述

provide和inject

在Vue中,依赖注入的方式是通过provide和inject两个选项来实现的。

provide选项允许一个祖先组件向下提供数据或服务给它的所有后代组件。
inject选项允许一个后代组件接收来自祖先组件的数据或服务。
这两个选项都可以是一个对象或一个函数,对象的键是提供或接收的数据或服务的名称,值是对应的数据或服务。函数的返回值是一个对象,具有相同的格式。

下面是一个简单的例子,演示了如何使用依赖注入的方式共享数据:

父组件

<template><div><h1>我是祖先组件</h1><child-component></child-component></div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'export default {name: 'AncestorComponent',components: {ChildComponent},// 提供一个名为message的数据provide: {message: 'Hello from ancestor'}
}
</script>

子组件

<template><div><h2>我是后代组件</h2><p>{{ message }}</p></div>
</template>
// 后代组件
<script>
export default {name: 'ChildComponent',// 接收一个名为message的数据inject: ['message']
}
</script>

这样,后代组件就可以直接使用祖先组件提供的数据,而不需要通过props或事件来传递。

需要注意的是,依赖注入的数据是不可响应的,也就是说,如果祖先组件修改了提供的数据,后代组件不会自动更新。
如果需要实现响应性,可以使用一个响应式的对象或者一个返回响应式对象的函数作为provide的值。

实现响应式依赖注入的几种方式

在这里插入图片描述

一、提供响应式数据

方法是在提供者组件中使用ref或reactive创建响应式数据,然后通过provide提供给后代组件。后代组件通过inject接收后,就可以响应数据的变化。

提供者:

<template><div><h1>我是提供者组件</h1><button @click="count++">增加计数</button><child-component></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue'
import { ref, provide } from 'vue'export default {name: 'ProviderComponent',components: {ChildComponent},setup() {// 使用ref创建一个响应式的计数器const count = ref(0)// 提供给后代组件provide('count', count)return {count}}
}
</script>

接收者:

<template><div><h2>我是接收者组件</h2><p>计数器的值是:{{ count }}</p></div>
</template><script>
import { inject } from 'vue'export default {name: 'ChildComponent',setup() {// 接收提供者组件提供的响应式对象const count = inject('count')return {count}}
}
</script>

二、提供修改数据的方法

提供者组件可以提供修改数据的方法函数,接收者组件调用该方法来更改数据,而不是直接修改注入的数据。

提供者:

<template><div><h1>我是提供者组件</h1><p>消息是:{{ message }}</p><child-component></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue'
import { ref, provide } from 'vue'export default {name: 'ProviderComponent',components: {ChildComponent},setup() {// 使用ref创建一个响应式的消息const message = ref('Hello')// 定义一个更改消息的方法function updateMessage() {message.value = 'Bye'}// 提供给后代组件provide('message', { message, updateMessage })return {message}}
}
</script>

接收者:

<template><div><h2>我是接收者组件</h2><p>消息是:{{ message }}</p><button @click="updateMessage">更改消息</button></div>
</template><script>
import { inject } from 'vue'export default {name: 'ChildComponent',setup() {// 接收提供者组件提供的响应式对象和方法const { message, updateMessage } = inject('message')return {message,updateMessage}}
}
</script>

三、使用readonly包装

通过readonly包装provide的数据,可以防止接收者组件修改数据,保证数据流的一致性。

提供者:

<template><div><h1>我是提供者组件</h1><p>姓名是:{{ name }}</p><child-component></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue'
import { ref, provide, readonly } from 'vue'export default {name: 'ProviderComponent',components: {ChildComponent},setup() {// 使用ref创建一个响应式的姓名const name = ref('Alice')// 使用readonly包装提供的值,使其不可修改provide('name', readonly(name))return {name}}
}
</script>

接收者:

<template><div><h2>我是接收者组件</h2><p>姓名是:{{ name }}</p><button @click="name = 'Bob'">尝试修改姓名</button></div>
</template><script>
import { inject } from 'vue'export default {name: 'ChildComponent',setup() {// 接收提供者组件提供的只读对象const name = inject('name')return {name}}
}
</script>

四、使用<script setup>

<script setup>组合式写法下,provide和inject默认就是响应式的,无需额外处理。

总结

在这里插入图片描述

依赖注入的方式共享数据在Vue中是一种高级特性,它主要用于开发插件或库,或者处理一些特殊的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS的加密方式超详细解读

在了解https的加密方式之前&#xff0c;我们需要先行了解两个特别经典的传统加密方式&#xff1a; 1、对称加密 1.1、定义 需要对加密和解密使用相同密钥的加密算法。所谓对称&#xff0c;就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解…

【技术干货】开源库 Com.Gitusme.Net.Extensiones.Core 的使用

目录 1、项目介绍 2、为项目添加依赖 3、代码中导入命名空间 4、代码中使用 示例 1&#xff1a;string转换 示例 2&#xff1a;object转换 1、项目介绍 Com.Gitusme.Net.Extensiones.Core是一个.Net扩展库。当前最新版本1.0.4&#xff0c;提供了常见类型转换&#xff0c…

<蓝桥杯软件赛>零基础备赛20周--第4周--杂题-1

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

统计学习方法 条件随机场

文章目录 统计学习方法 条件随机场随机场马尔可夫随机场定义因子分解 条件随机场定义参数化形式简化形式矩阵形式 概率预测问题前向-后向算法概率的计算期望值的计算 学习问题改进的迭代尺度法拟牛顿法 解码问题 统计学习方法 条件随机场 学习李航的《统计学习方法》时&#x…

ok-解决qt5发布版本,直接运行exe缺少各种库的问题

已实验第二种方法可用。 工具&#xff1a;电脑必备、QT下的windeployqt Qt 官方开发环境使用的动态链接库方式&#xff0c;在发布生成的exe程序时&#xff0c;需要复制一大堆 dll&#xff0c;如果自己去复制dll&#xff0c;很可能丢三落四&#xff0c;导致exe在别的电脑里无法…

C++11 智能指针学习笔记

非常棒的学习博客 在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。 1. shared_ptr 共享智能指针是指多个智能指针可以同时管理同一块有效的内存&#xff0c;共享智能指针 shared_ptr 是一个模板类。智能指针的核心实现技术是引用…

Framebuffer 介绍和应用编程

前言&#xff1a; 使用的开发板为韦东山老师的 IMX6ULL 目录 Framebuffer介绍 LCD 操作原理 涉及的 API 函数 1.open 函数 2.ioctl 函数 3.mmap 函数 Framebuffer 程序分析 1.打开设备 2.获取 LCD 参数 3.映射 Framebuffer 4.描点函数 5.随便画几个点 6.上机实验…

[vmware]vmware虚拟机压缩空间清理空间

vmware中的ubuntu使用如果拷贝文件进去在删除&#xff0c;vmare镜像文件并不会减少日积月累会不断是的真实物理磁盘空间大幅度减少&#xff0c;比如我以前windows操作系统本来只有30GB最后居然占道硬盘200GB&#xff0c;清理方法有2种。 第一种&#xff1a;vmware界面操作 第二…

Lamport Clock算法

Lamport Clock 是一种表达逻辑时间的逻辑时钟&#xff08;logical clock&#xff09;&#xff0c;能够计算得到历史事件的时间偏序关系。 假设 P0进程是分布式集群中心节点中的监控者&#xff0c;用于统一管理分布式系统中事件的顺序。其他进程在发送消息之前和接受事件消息之后…

持续进化,快速转录,Faster-Whisper对视频进行双语字幕转录实践(Python3.10)

Faster-Whisper是Whisper开源后的第三方进化版本&#xff0c;它对原始的 Whisper 模型结构进行了改进和优化。这包括减少模型的层数、减少参数量、简化模型结构等&#xff0c;从而减少了计算量和内存消耗&#xff0c;提高了推理速度&#xff0c;与此同时&#xff0c;Faster-Whi…

包装印刷行业万界星空科技云MES解决方案

印刷业的机械化程度在国内制造行业内算是比较高的&#xff0c;不算是劳动密集型企业。如书本的装订、包装的模切、烫金、糊盒等都已经有了全自动设备。印刷厂除了部分手工必须采用人工外&#xff0c;大部分都可以采用机器&#xff0c;也就意味着可以由少量工人生产出大量产品。…

【油猴脚本】学习笔记

目录 新建用户脚本模板源注释 测试代码获取图标 Tampermonkey v4.19.0 原教程&#xff1a;手写油猴脚本&#xff0c;几分钟学会新技能——王子周棋洛   Tampermonkey首页   面向 Web 开发者的文档   Greasy Fork 新建用户脚本 打开【管理面板】 点击【】&#xff0c;即…