uni-app开发时提示[Vue warn]: injection "xxx" not found.,但在web、微信小程序均正常

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app开发时提示[Vue warn]: injection “xxx” not found.,但在web、微信小程序均正常

项目信息 详细信息
产品分类 uniapp/小程序/字节跳动
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 22H2
HBuilderX类型 正式
HBuilderX版本号 3.98
第三方开发者工具版本号 4.1.6
基础库版本号 3.1.0.7
项目创建方式 HBuilderX

操作步骤:

  • 使用provide往子组件传递信息,子组件无法接收到信息且提示injection “xxx” not found,如
    • 父组件:provide(“message”, “消息”)
    • 子组件:const message = inject(“message”, null)
  • 但是在main.js内往全局注册一个provide子组件是可以收到的,如
    • const app = createSSRApp(App)
    • app.provide(“message”, “消息”)
  • 同时在web端和微信小程序端也是可以正常父子组件传递,该问题只存在于抖音小程序

预期结果:

  • 子组件应收到父组件传递的信息

实际结果:

  • 子组件无法接收到信息且提示injection “xxx” not found

bug描述:

  • 使用provide往子组件传递信息,子组件无法接收到信息且提示injection “xxx” not found,如
    • 父组件:provide(“message”, “消息”)
    • 子组件:const message = inject(“message”, null)
  • 但是在main.js内往全局注册一个provide子组件是可以收到的,如
    • const app = createSSRApp(App)
    • app.provide(“message”, “消息”)
  • 同时在web端和微信小程序端也是可以正常父子组件传递,该问题只存在于抖音小程序

2 回复

参考该issue,使用Options Api


在 uni-app 开发过程中,如果你遇到 [Vue warn]: injection "xxx" not found. 的警告,但在 Web 和微信小程序中表现正常,这通常是因为某些平台(如 H5 或小程序)对 Vue 的依赖注入机制的支持不完全一致,或者某些插件或库在不同平台下的行为不一致。

以下是一些可能的原因和解决方法:


1. 检查依赖注入的提供者(Provider)是否存在

  • 确保你在父组件中正确使用了 provide 提供了需要注入的值。
  • 例如:
    export default {
      provide() {
        return {
          xxx: this.someValue
        };
      }
    };
  • 如果 provide 没有正确设置,子组件在尝试注入时会抛出警告。

2. 检查注入的键名是否正确

  • 确保子组件中 inject 的键名与父组件中 provide 的键名完全一致。
  • 例如:
    export default {
      inject: ['xxx']
    };

3. 平台差异

  • 某些平台(如 H5 或小程序)可能对 Vue 的依赖注入机制支持不完全,或者某些插件在不同平台下的行为不一致。
  • 解决方法:
    • 检查是否有平台特定的代码逻辑,确保在所有平台下都能正确提供和注入值。
    • 使用 #ifdef 条件编译来处理平台差异:
      #ifdef H5
      provide() {
        return {
          xxx: this.someValue
        };
      }
      #endif

4. 插件或库的问题

  • 如果你使用了第三方插件或库,可能是该插件在某些平台下未正确提供依赖注入的值。
  • 解决方法:
    • 检查插件的文档,确认其是否支持所有目标平台。
    • 如果插件有问题,可以尝试手动提供缺失的值,或者联系插件作者。

5. 生命周期问题

  • 确保 provide 的值在子组件尝试注入时已经准备好。
  • 如果 provide 的值是异步获取的,可能会导致子组件在初始化时无法找到注入的值。
  • 解决方法:
    • 使用 watchcomputed 来动态更新 provide 的值。
    • 例如:
      export default {
        data() {
          return {
            someValue: null
          };
        },
        async created() {
          this.someValue = await fetchSomeData();
        },
        provide() {
          return {
            xxx: this.someValue
          };
        }
      };
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!