Vue3打包部署后报错:Uncaught (in promise) Error

部署后打开网页报错信息:Uncaught (in promise) Error: useModal() can only be used inside setup() or functional components!

该报错在本地运行无法复现,只有run build之后,部署到服务器上,进入这个页面就会出现报错,并且伴随网页其他页面也卡死。首先我们先看下简化后的关键代码:


<template>
  <div>
    <button @click="handleDetail">详情</button>
    <TaskDetailModal ref="registerModal" @register="registerModal" @success="handleSuccess" />
  </div>
</template>

<script lang="ts" setup>
  import { reactive, onMounted, provide } from 'vue';
  import { useModal } from '/@/components/Modal';
  import TaskDetailModal from './components/TaskDetailModal.vue';

  const [registerModal, { openModal }] = useModal();

  /**
   * 详情
   */
  function handleDetail(record: Recordable) {
    openModal(true, {
      record,
      isUpdate: false,
    });
  }

  /**
   * 成功回调
   */
  function handleSuccess() {
    (selectedRowKeys.value = []) && reload();
  }
</script>

 我们看到报错是有关于useModal() hook的,在我们确保引入路径,没有问题的情况下,代码看上去一片祥和,因为本地启动的服务也不会报错。问过deepseek及翻阅多篇资料找到如下原因:

  1. 调用位置检查‌:严格限制 useModal() 的使用范围,仅在 setup() 或函数式组件内调用。
  2. 异常捕获‌:为所有异步操作添加 .catch() 或 try-catch,避免未处理的 Promise 异常‌25。
  3. 代码规范‌:遵循 Vue 3 的 Composition API 设计模式,分离逻辑与视图。

很显然,这块代码都没有这些问题,在苦思不得解的时候,大佬告知ref="registerModal" 的值与函数registerModal重名,遂移除ref="registerModal"这一无用属性,这个问题便解决了。

问题原因推测是方法和refs是在同一作用域下,可能会有覆盖问题,导致方法无法调用。

若有大佬能有更好的见解,欢迎在评论区留下您宝贵的评论\(^o^)/~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值