Vue3 与依赖注入
Vue3 与依赖注入
本文写于 2021 年 2 月 19 日
在 React 中,我们可以通过 context 与 useContext 实现单例、注入……等诸多特性。
详细请看上一篇文章:如何利用 React Hooks 管理全局状态.
例如:
const SomeService = createContext(null);
const useRootSomeService = () => {
const [n, setN] = useState(0);
const add = useCallback(() => {
setN((number) => number + 1);
}, []);
return { n, setN };
};
const App: React.FC = () => {
return (
<SomeService.Provider value={useRootSomeService()}>
<Apple />
</SomeService>
)
};
const Apple: React.FC = () => {
const someService = useContext(SomeService)
};
那么 Vue3 可以吗?
可以!!!只需要利用 Vue3 的 provide 与 inject API 即。
创建一个 Service
import { Ref, ref } from "vue";
class ChatService {
static INJECT_KEY: string;
conversations: Ref<Conversation[]>;
constructor() {
this.conversations = ref([]);
}
}
这样我们只需要在组件中实例化该 class,就可以拥有响应性的 conversations 属性了。
但是我们不满足于如此,我们还想要在任何地方,都可以使用 const chatService = inject(ChatService); 来拿到服务的单例!
provide/inject
vue3 提供给我们的 provide API 可以在任意组件中使用:provide(key, variable);
使用后该组件的自组件的任何位置都可以利用 inject API 拿到刚刚注入的变量:const v = inject(key);。
因此我们可以这么封装一下:
import { provide as vueProvide, inject as vueInject } from "vue";
export const createInjectKey = () => {
const randomNumber = Math.round(Math.random() * 10 ** 8).toString();
return randomKey;
};
interface ServiceType<T> {
new (): T;
INJECT_KEY: string;
}
export function provide<T>(Service: ServiceType<T>) {
const key = createInjectKey();
Service.INJECT_KEY = key;
vueProvide(key, new Service());
}
export function inject<T>(Service: ServiceType<T>): T {
const service = vueInject<T>(Service.INJECT_KEY);
if (!service) {
console.error("You have to provide service first!!!");
}
return service!;
}
这样一来,我们只需要写一个拥有 static INJECT_KEY 属性的 class,就可以在组件树顶端使用 provide(xxxService),然后再在任意位置调用 inject(xxxService) 来获取服务单例了!
(完)
Vue3 与依赖注入的更多相关文章
- 【17MKH】我在框架中对.Net依赖注入的扩展
说明 依赖注入(DI)是控制反转(IoC)的一种技术实现,它应该算是.Net中最核心,也是最基本的一个功能.但是官方只是实现了基本的功能和扩展方法,而我呢,在自己的框架 https://github. ...
- webapi - 使用依赖注入
本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...
- ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用
再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起
我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...
- 模拟AngularJS之依赖注入
一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...
随机推荐
- Iterator 和 ListIterator 有什么区别?
1.ListIterator 可以在遍历的时候,调用add()添加元素 2.ListIterator提供了更多的一些方法,如previous().hasPrevious() 等
- 学习zabbix(一)
一.zabbix监控简介 server: 通过收集snmp和agent发送的数据,写入数据库(MySQL,ORACLE),再通过 php+apache 在 web 前端展示. agent:主机通过安装 ...
- OpenCV+QT5在Window下的环境配置记录
在安装OpenCV时最需要注意的是,OpenCV库,也就是我们需要的dll和动态库需要我们使用CMake来生成. 虽然在官网上下载得到的文件中已经包含了库文件和.h等头文件,但是在具体开发中编译器编译 ...
- LQR (线性二次型调节器)的直观推导及简单应用
转自:https://blog.csdn.net/heyijia0327/article/details/39270597 本文主要介绍LQR的直观推导,说明LQR目标函数J选择的直观含义以及简单介绍 ...
- C#编写程序,用 while 循环语句实现下列功能
编写程序,用 while 循环语句实现下列功能:有一篮鸡蛋,不止一个,有人两个两个数,多余一个,三个三个数,多余一个,再四个四个地数,也多余一个,请问这篮鸡蛋至少有多少个. 代码: using Sys ...
- python pymysql连接数据库并创建表
之前看菜鸟教程 #!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost"," ...
- 居中select中的option选项
select经常有长短不一的选项:选择不同的选项居中不会生效: 使用text-align:center;text-align-last: center; 可以让所有选项都居中: 关于text-dec ...
- 自学java如何快速地达到工作的要求?
自学java如何快速地达到工作的要求,是很多初学者都比较关心的问题,对于初学者来说,盲目自学不但不能快速入门,还会浪费大量的时间. 今天知了堂就来分享自学Java如何快速达到找工作的要求. 1.自学J ...
- spring-基于注解的aop开发(快速入门)
步骤: 1.导入坐标 <dependency> <groupId>junit</groupId> <artifactId>junit</artif ...
- 《java基础——对象的拷贝》
java基础--对象的拷贝 一.浅拷贝: 规则: 1. 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化. 2. 浅拷贝相当于两个对象共用一套实例. 格式: 类名 对象 ...