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

vue3和vue2 之 provide/inject 用法区别 ---vue3组件间通讯2

一、为什么用他们?

 provide/inject 主要用于父组件和子孙组件间通讯,不用在父传子,子传孙,孙传重孙等数据传递了(解决了Prop 逐级透传问题)。简单的父子组件间传值还是使用props、emits或是defineProps、defineEmits、defineExpose比较方便。

二、原理 与 区别

父组件中提供数据,并在其后代的组件树,无论层级有多深,都可以中注入这些数据,从而实现了组件之间的数据传递。。

1. 在vue2中,组件实例方法和属性的继承是通过原型链来实现。

  • 当一个组件通过 provide 提供数据,它会将这些数据添加到其原型链上,然后子组件通过 inject 可以在原型链上查找并访问这些数据。
  • vue 会遍历父组件链,通过匹配provide( key,value)和inject(key,default [可选])的 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会“覆盖”链上更远的组件所提供的值。如果没有能通过 key 匹配到值,inject() 将返回 undefined,除非提供了一个默认值。

2. 在 Vue 3 中 组件不再依赖于原型链,而是 引入了 Composition API,直接导出给组件实例。

  • provide 是在父组件中使用的选项,它是一个函数,会在父组件实例上创建一个名为 _provided 的对象。_provided 对象存储了提供给子组件的数据,而且这些数据会在整个组件树中可用,子组件可以通过inject选项来访问这些数据。
  • 当子组件访问通过inject注入的数据时,Vue 3会在组件树中向上搜索父组件,一旦找到包含提供数据的组件,Vue 3会从该组件的_provided属性中获取相应的数据。
  • 如果提供的数据是响应式的,子组件将自动成为这些数据的依赖,当提供的数据发生变化时,子组件将被通知并进行更新。 

三、使用方式

1. vue2中的使用

父组件:

// 1. 对象形式
export default{provide:{info:"哈哈哈"}}//2. provide 需要使用 data 内的数据(访问组件实例 property)时,需要将 provide 转换为返回对象的函数。
export default{data() {return {msg: "哈哈哈"};},provide() {return {info: this.msg //提供祖先组件的实例};},
}

后代组件:

// 1. 
export default{inject:['info'],mounted(){console.log("接收数据:", this.info) // 接收数据:哈哈哈}}//2. 或者 对象形式
<template><div><P>姓名:{{info.msg}}</P></div>
</template><script>
export default {inject: {info: {from: 'info', // 当声明注入的默认值时,必须使用对象形式,与原注入名同名时,这个属性可选 default: 'default value'}} 
};
</script>

2. vue3中的使用

父组件:

//1. 
<script>
import { provide } from "vue"export default {setup(){provide('info',"哈哈哈");provide('changeSubmitLoading', (val) => {submitLoading.value = val})}
}
</script>// 2. 添加响应性
<script setup>import { provide, ref } from 'vue'const location = ref('哈哈哈')function updateLocation() {location.value = '吼吼吼'
}provide('location', {location,updateLocation
})
</script>

后代组件:

// 1. 
<template> {{info}}
</template><template #cell="{ record }"><a-button size="mini" type="text"  @click="handleDelete(record)"></a-button>
</template><script>
import { inject } from "vue"export default {setup(){const info = inject('info')const changeSubmitLoading = inject('changeSubmitLoading')const handleDelete = (record) => {/* 方法内其他内容*/  changeSubmitLoading(true)}return{info}}
} 
</script>//2. 添加响应性后<template><button @click="updateLocation">{{ location }}</button>
</template><script setup>
import { inject } from 'vue'const { location, updateLocation } = inject('location')
</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • gpt的构造和原理
  • CentOS安装MySQL数据库
  • java操作mongodb详解
  • 汽车CAN网络中的checksum和Rollingcounter的作用?
  • FSQ8罗德与施瓦茨FSQ8信号分析仪
  • 第六题:标题统计
  • 第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间
  • Transformer重磅更新!新SOTA提速50%,更节省计算资源
  • 无人售货奶柜:开启便捷生活的新篇章
  • 记一次Cannot deploy POJO class [xxx$$EnhancerBySpringCGLIB$$xxx]的错误
  • 秒杀活动库存扣减逻辑详解:从批量到单个,再到缓存与日志记录
  • redis链表结构和简单动态字符串(SDS)
  • Docker之镜像与容器的相关操作
  • docker-相关
  • STL--list和vector有什么区别
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular 4.x 动态创建组件
  • create-react-app项目添加less配置
  • Fundebug计费标准解释:事件数是如何定义的?
  • Javascript设计模式学习之Observer(观察者)模式
  • Java精华积累:初学者都应该搞懂的问题
  • php ci框架整合银盛支付
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 给github项目添加CI badge
  • 区块链技术特点之去中心化特性
  • 深度解析利用ES6进行Promise封装总结
  • 用 Swift 编写面向协议的视图
  • 怎么将电脑中的声音录制成WAV格式
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #13 yum、编译安装与sed命令的使用
  • #传输# #传输数据判断#
  • (007)XHTML文档之标题——h1~h6
  • (11)MSP430F5529 定时器B
  • (2020)Java后端开发----(面试题和笔试题)
  • (9)STL算法之逆转旋转
  • (pycharm)安装python库函数Matplotlib步骤
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (七)Flink Watermark
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)setTimeout 和 setInterval 的区别
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net 验证控件和javaScript的冲突问题
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET成年了,然后呢?
  • .NET连接MongoDB数据库实例教程
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ linux ] linux 命令英文全称及解释
  • [30期] 我的学习方法