vue3学习(十)--- 依赖注入Provide 和 Inject

news2025/3/10 18:25:49

文章目录

  • Provide 和 Inject
  • 兄弟组件通信Event Bus
    • Mitt库

Provide 和 Inject

provide 可以在祖先组件中指定我们想要提供给后代组件----子、孙等组件的数据或方法,而在任何后代组件中,我们都可以使用 inject 来接收 provide 提供的数据或方法。
在这里插入图片描述

父组件
<template>
    <div class="App">
        <button>我是App</button>
        <A></A>
    </div>
</template>
    
<script setup lang='ts'>
import { provide, ref,readonly } from 'vue'
import A from './components/A.vue'
let flag = ref<number>(1)
provide('flag', flag) 父组件传递

provide('flag', readonly(flag)) 这种传递方式子组件是无法修改数据的
</script>
    
<style>
.App {
    background: blue;
    color: #fff;
}
</style>
子组件
<template>
    <div style="background-color: green;">
        我是B
        <button @click="change">change falg</button>
        <div>{{ flag }}</div>
    </div>
</template>
    
<script setup lang='ts'>
import { inject, Ref, ref } from 'vue'
 
const flag = inject<Ref<number>>('flag', ref(1)) 子组件接收
const change = () => {
    flag.value = 2 子组件可以修改传递的值
}
</script>
    
<style>
</style>

注意:你如果传递普通的值是不具有响应式的 需要通过ref reactive 添加响应式。

如果不让后代组件修改数据可以在传递数据的时候加上readonly限制。


兄弟组件通信Event Bus

这个原理其实是运用了JS设计模式之发布订阅模式,通过一个中间件来处理。

 
type BusClass<T> = {
    emit: (name: T) => void
    on: (name: T, callback: Function) => void
}
type BusParams = string | number | symbol 
type List = {
    [key: BusParams]: Array<Function>
}
class Bus<T extends BusParams> implements BusClass<T> {
    list: List
    constructor() {
        this.list = {}
    }
    emit(name: T, ...args: Array<any>) {
        let eventName: Array<Function> = this.list[name]
        eventName.forEach(ev => {
            ev.apply(this, args)
        })
    }
    on(name: T, callback: Function) {
        let fn: Array<Function> = this.list[name] || [];
        fn.push(callback)
        this.list[name] = fn
    }
}
 
export default new Bus<number>()

Mitt库

Mitt是一个体积极小的第三方消息发布/订阅式JavaScript库,React、Vue均可以使用。

安装

  npm install --save mitt

main.ts 初始化

import { createApp } from 'vue'
import App from './App.vue'
import mitt from 'mitt'

const Mit = mitt()

//TypeScript注册
// 由于必须要拓展ComponentCustomProperties类型才能获得类型提示
declare module "vue" {
    export interface ComponentCustomProperties {
        $Bus: typeof Mit
    }
}

const app = createApp(App)

//Vue3挂载全局API
app.config.globalProperties.$Bus = Mit

app.mount('#app')

A组件派发(emit)

<template>
    <div>
        <h1>我是A</h1>
        <button @click="emit1">emit1</button>
        <button @click="emit2">emit2</button>
    </div>
</template>

<script setup lang='ts'>
import { getCurrentInstance } from 'vue'
const instance = getCurrentInstance();
const emit1 = () => {
    instance?.proxy?.$Bus.emit('on-num', 100)
}
const emit2 = () => {
    instance?.proxy?.$Bus.emit('*****', 500)
}
</script>

<style>
</style>

B组件监听(on)

<template>
    <div>
        <h1>我是B</h1>
    </div>
</template>

<script setup lang='ts'>
import { getCurrentInstance } from 'vue'
const instance = getCurrentInstance()
instance?.proxy?.$Bus.on('on-num', (num) => {
    console.log(num,'===========>B')
})
</script>

<style>
</style>
监听一个
instance?.proxy?.$Bus.on('on-num', (num) => {
    console.log(num,'===========>B')
})


监听所有
instance?.proxy?.$Bus.on('*',(type,num)=>{
    console.log(type,num,'===========>B')
})


移除监听事件
instance?.proxy?.$Bus.on('on-num',Fn)//listen
instance?.proxy?.$Bus.off('on-num',Fn)//unListen


清空所有监听 
instance?.proxy?.$Bus.all.clear() 

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

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

相关文章

yield方法的使用

yield的作用就是主动释放CPU的执行权,会将线程从运行状态转为就绪状态,让后调度执行其他线程 使用方法如下: public class YieldTest {public static void main(String[] args) {ThreadTest t1 new ThreadTest("张三");ThreadTest t2 new ThreadTest("李四&q…

设计师首选:最佳的5款网页设计软件

对于UI设计师来说&#xff0c;网页设计是一项必要的技能。如何做好网页设计&#xff1f;除了设计理念&#xff0c;网页设计和制作软件的应用也是不可或缺的。目前市场上有很多这样的软件&#xff0c;工人要想做好&#xff0c;就必须先磨利工具。如果他们想做网页设计&#xff0…

14. Java多线程基础

Java —— 多线程 1. 线程与进程1.1 线程生命周期1.2 线程优先级 2. 多线程2.1 守护线程2.2 多线程高并发2.3 synchronized同步锁2.4 synchronized互斥锁 1. 线程与进程 进程&#xff08;Process&#xff09; 操作系统进行资源分配和调度的基本单位&#xff1a;系统中正在运行的…

复制活动工作表和计数未保存工作簿进行

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

基于springboot实现酒店管理系统平台项目【项目源码+论文说明】计算机毕业设计

摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例

分割数组的最大值 相关知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例&#xff1a;付视频课程 二分 过些天整理基础知识 题目 给定一个非负整数数组 nums 和一个整数 m &#xff0c;你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法…

【前端学习】—bind、call、apply(四)

【前端学习】—bind、call、apply(四) 一、代码题 <script>var name="freeman";function sayAuthor(){var name=

2023.10(u盘刻录iso)主机,vmware,virtualbox安装linux/ubuntu/kali

download 1 kali官网 2 ubuntu官网 3vmware workstation pro(最新版17pro) 4 virtualbox for linux sudo apt install virtualbox-ext-pack 5 win32 disk imger linux dd 刻录iso到u盘 #查看U盘路径 fdisk -l #图形界面 以kali为例会在桌面出现挂载图标 点开之后输入pwd寻…

【Android】 屏幕录制screenrecord为什么这么快?

背景 正常的合成视频是个什么样流程? 主要有三大类方法&#xff1a;MediaMux硬解码&#xff0c;mp4parser&#xff0c;FFmepg三种方式详情传送门, 但是并不能把高帧率、分辨率屏幕视频实时保存下来 那么Android screenrecord命令是怎么做的呢&#xff1f; 一般的android图像流…

【开发心得】Jaxb使用珠玑

前言 Java操作xml转换成javaBean,或者javaBean转换为xml的方式有很多。常见的有dom4j等工具直接操作dom&#xff0c;或者使用jaxb. jaxb介绍: JAXB(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML表示方式。JAXB提供两种主要特性&#xff1a;…

运动品牌如何做到“全都要”?来看看安踏的答案

文 | 螳螂观察 作者 | 易不二 运动鞋服是兼具高景气和清晰格局的优质消费赛道。 中信证券给出的这一预测&#xff0c;欧睿国际也做出了更具体的测算&#xff1a;预计到2027年&#xff0c;中国运动服饰市场规模有望以约为8.7%的年复合增长率&#xff0c;突破5500亿元人民币。…

零宽空格引发的问题

有人跟我反馈说有bug。 我说&#xff1a;啥bug&#xff1f; 对方说&#xff1a;刚申请的内部用户的账号登录不上去。 我说&#xff1a;还有这种事&#xff0c;报啥错&#xff1f; 登录的时候报了这个错&#xff1a; 我一看还好还好&#xff0c;跟上一次不一样的错&#xff…

有消息称苹果Vision Pro会有廉价版

据外媒爆料&#xff0c;苹果公司苹果正在研发的头显产品Vision Pro&#xff0c;将会有廉价版。据透露&#xff0c;这款产品预计售价在1500美元至2500美元之间&#xff0c;虽然仍不算低&#xff0c;但较现有的Vision Pro 3499美元的起售价&#xff0c;还是有明显降低。 透露廉价…

AcWing 5180. 正方形泳池

原题链接&#xff1a;5180. 正方形泳池 - AcWing题库 说实话题解和视频题解都不太好&#xff0c;有点过于复杂了&#xff0c;那就不得不记录一下我看视频题解衍生出的另一个较为简单的思路了。 根据答案形态出发&#xff0c;枚举所有这种形态找出最大值。 可以发现最大的泳池要…

十分钟了解IPv6升级改造安全优势

相信IPv6的地址数量优势已为大家熟知&#xff0c;丰沛的地址存量是IPv6被选作新一代网络承载协议并逐渐商用部署的根本驱动力。 然而IPv6协议相比于IPv4&#xff0c;不仅地址数量接近无限&#xff0c;还在网络安全性方面更胜一筹。本文将为您集中介绍IPv6的安全优势。 CSDN大…

微信小程序开发之flex布局及轮播图组件与后台Mock.js交互

目录 前言 一.flex布局 1.什么的flex布局 2.容器属性 2.1 flex-direction属性 2.2 flex-wrap属性 2.3 justify-content属性 特点&#xff1a; 二.轮播图 1.配置地址请求信息 2.通过方法加载轮播图数据 3.合法域名纠正 ​编辑 4.通过Mock.js模拟响应数据 5.轮播图前…

前端开发工具有哪些?17款前端工程师必备工具推荐!

软件开发是一个高度专业化的职业分工&#xff0c;根据所使用的编程语言的不同&#xff0c;会细分出多种岗位&#xff1a;前端开发、后端开发、客户端开发、iOS开发、Android开发、数据库开发等等&#xff0c;具体到每一个岗位&#xff0c;工作中常用的工具软件也存在着差别。 …

框架篇

一、Spring中的单例Bean是线程安全的吗 二、AOP相关面试题 三、Spring中的事务 四、Spring中事务失效的场景有 五、Spring bean的生命周期 六、Spring的循环依赖 七、SpringMVC的执行流程 八、自动配置原理 九、Spring框架常见的注解 十、Mybatis的执行流程 十一、MyBatis延迟加…

进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则

目录 1.0 什么是 Lambda 表达式&#xff1f; 1.1 既然跟匿名内部类相关&#xff0c;先来回顾匿名内部类。 1.2 Lambda 表达式与匿名内部类之间的关系。 1.3 函数式接口 1.4 在具体代码中来操作一下 2.0 Lambda 表达式省略规则 1.0 什么是 Lambda 表达式&#xff1f; Lambda 表达…

企业打造VR虚拟展厅,开启商务洽谈新时代!

现代化数字营销中&#xff0c;企业做了虚拟线上展厅和不做虚拟展厅的对比是很明显的&#xff0c;VR虚拟展厅让企业产品、企业环境、企业实力的展示更加真实、直观。虚拟展厅是一种在线展示企业形象和品牌的新型方式&#xff0c;随着VR技术的发展&#xff0c;虚拟展厅正在逐步取…