[BUG记录] vue3 setup provide/inject:无法正常进行依赖注入

注意:新版本中没有这个bug了,只要保证provide 需在 <script setup> 中同步执行就行。在线调试


项目场景:

以服务的方式来调用element-plus loading,导致vue组件依赖注入失效:祖先组件部分属性无法 provide,后代组件无法 inject 祖先组件 provide 的值


问题描述

调试信息:
祖先组件:

[Vue warn]: provide() can only be used inside setup(). 

后代组件:

[Vue warn]: injection "manager" not found.

原因分析:

导致此bug的改动为:增加了一个接口请求的加载提示

示例:

<script setup>
import { ref, reactive, toRefs, provide } from 'vue'
import { apiFunc } from '@/api/demo'
import { ElLoading } from 'element-plus'
import Comp from './comp.vue'

const props = defineProps({
  pid: { type: [Number, String], default: '' },
  source: { type: String, default: '' }
})

const { pid, source } = toRefs(props)

provide('source', source)
provide('pid', pid)

async function getDataList() {
  const pageLoading = ElLoading.service({ target: '.container', text: 'Loading' })
  let res = await apiFunc()
  pageLoading.close()
}
getDataList()
provide('testFunc', getDataList)

const testData = reactive({ name: 'Anne' })
provide('name', computed(() => testData.name))

</script>
<template>
  <Comp />
</template>

调试发现 source, pid 正常插入,但后两个失效

“async setup() 必须与 Suspense 内置组件组合使用”

provide 需在setup中同步执行

分析发现,是 ElLoading 的同步调用导致后续 provide 的执行出了问题([Vue warn]: provide() can only be used inside setup().


解决方案:

分析发现是 element-plus 的bug。上例中,可以选择将后续的 provide 上移。但不是解决问题的根本办法,将 getDataList 改为异步执行可以避免出现这个bug

getDataList()

import { onMounted } from 'vue'
onMounted(() => {
  getDataList()
})
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值