应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue3 provide与inject 。vue3 跨越组件传递参数,传参。父子组件传值,爷孙组件传参。跨层级传值,整个组件树中共享传值

854人阅读 2024/8/20 22:41 总访问:5182888 评论:0 收藏:0 手机
分类: 前端

在 Vue 3 中,provide 和 inject 是用于实现跨组件通信的 API,特别是当组件层次结构较深时很有用,不然如果层级太深了要一级一级的往下传比较麻烦,用provide 和inject,可以在整个组件树中共享。

基础使用

父组件

父组件赋值之后可以在整个组件树中都获取到值,后代子组件都能获取到值

  1. <script lang="ts" setup>
  2. import { reactive,provide } from 'vue'
  3. const provideData = reactive({
  4. stid: "",
  5. schoolId:"",
  6. schoolName:""
  7. })
  8. provide('schoolInfo', provideData);
  9. </script>

子组件,或者说是后代组件中

  1. <script lang="ts" setup>
  2. import { inject } from 'vue'
  3. const schoolInfo:any = inject('schoolInfo');
  4. </script>

注意,要想子组件监听到变化,应该监听响应式对象的引用,而不是一个值,特别是想要提供的值是异步方法调用之后提供的

这样提供的值子组件获取不到

因为state虽然是响应式对象,但是state.userList不是,所以子组件获取到的值只是初始化的空值

  1. const state = reactive({
  2. ......其他字段
  3. userList:[]
  4. });
  5. provide('userList', state.userList);
  6. onMounted(() => {
  7. getUserList()
  8. });
  9. const getUserList = async()=>{
  10. const result: any = await request.get('/xx/api/useraccount/GetUserListByTenantID');
  11. state.userList = result.data
  12. }

这样监听响应式对象的引用是可以的

  1. const userListRef = reactive({ value: [] });
  2. provide('userList', userListRef);
  3. onMounted(() => {
  4. getUserList()
  5. });
  6. const getUserList = async()=>{
  7. const result: any = await request.get('/xx/api/useraccount/GetUserListByTenantID');
  8. userListRef.value = result.data
  9. }

在第二种方法中,创建了一个响应式对象 userListRef,它有一个 value 属性,初始值为空数组。然后,你在 setup 函数中调用了 provide(‘userList’, userListRef),将 userListRef 提供给子组件。由于 userListRef 是一个响应式对象,并且提供的是这个对象的引用,所以当 userListRef.value 被更新时,所有通过 inject 获取到 userListRef 的子组件都会接收到更新后的引用,并且可以访问到新的 value。

总结一下


当使用 provide 和 inject 时,你应该提供响应式对象的引用,而不是对象的直接属性(如数组或对象内部的字段)。这是因为 Vue 的响应式系统是基于引用追踪的,而不是基于值比较的。当你提供一个对象的引用时,Vue 能够追踪到这个对象的变化,并通知所有依赖这个对象的子组件。而当你直接提供一个属性(如数组)时,Vue 无法追踪到这个属性的变化(除非这个属性本身是一个响应式引用)。
因此,在你的情况下,你应该继续使用第二种方法,即通过提供一个响应式对象的引用来使用 provide 和 inject。

注意不能直接在异步请求里边使用provide

比如这种写法:

  1. const getUserList = async()=>{
  2. const result: any = await request.get('/xx/api/useraccount/GetUserListByTenantID');
  3. // 不能在请求里边直接使用provide,子组件获取不到这个接口返回的值
  4. provide('userList',result.data);
  5. }

在 Vue 3 的 Composition API 中,你不能在异步函数(如 API 请求回调)内部直接调用 provide 并期望它立即对已经渲染的子组件生效。provide 是在组件的 setup 函数中调用的,它设置了当前组件提供的依赖项,这些依赖项对于在 setup 函数执行期间或之后创建的子组件是可见的。

当你在异步函数(如 getUserList)中调用 provide 时,如果这个函数是在 setup 函数之外或之后调用的,那么它提供的值可能不会被已经渲染的子组件所接收。这是因为子组件的 setup 函数和渲染过程可能已经在父组件的 setup 函数执行完毕并且 provide 被调用之前就完成了。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

分布式服务架构微服务架构概念的区别联系

分布式:分散压力。微服务:分散能力。当下理解分布式:不同模块部署在不同服务器上作用:分布式解决网站高并发带来问题集...

jsController中分割字符串的方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(&quot;,&quot;); for(vari=0;i&lt;strs.length;i++){ $(&q...

Service-stack.redis配置连接池读写分离(处理并发相关等)

配置连接池与读写分类 //写节点(主节点) List&lt;string&gt;writes=newList&lt;string&gt;(); writes.Add(&quot;123456a...

CSS相对定位绝对定位

一般相对定位和绝对定位可以配合起来使用 例如实现如下的效果 只需要在外层div设置为相对定位,在内部设置为绝对定位就...

C委托事件

1.什么是委托?  委托在C#里的意义和在现实里差不多,从字面意思理解即可。举个例子:领导委托小张去传递个文件,这就是...

asp.net core2.0 依赖注入 AddTransientAddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

Vue.js+Layer实现表格数据绑定更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

下划线、换行、回车、空格ASCII码值对照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

数据读取器指定的"xx"不兼容某个类型为"xx"的成员在同名的数据读取器中没有对应的列

报错的地方var result= _db.Database.SqlQuery&lt;SMachine&gt;(sql).FirstOrDefault();经过分析,是因为SqlQuery方法查询...

git 下载提交命令

一.先使用git clone下载一个项目 git clone &#39;项目地址&#39; 这里要注意: clone的项目里边会自带git的一些信息,...

微信开发四 接受用户普通消息回复消息

微信接收用户普通消息的文章可以在官方中直接看微信普通消息分类:接受用户文本消息 与 回复文本信息 注意在接收用户普通...

记忆糖的关系【阅读听力】

Link Between Memory and SugarSugar On The BrainIt’s long been understood that there is a connection between memory...

婚姻心脏健康的关系【阅读听力】

Marriage and Heart HealthPlenty of studies have found that being married is generally good for health. One study ze...

iframe自适应高度配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core中使用url编码解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...