30天内只能修改
30天内只能修改
  • 发布:2024-06-05 10:13
  • 更新:2024-06-19 08:04
  • 阅读:804

【报Bug】vue3小程序使用defineExpose父组件无法调用导出方法

分类:uni-app

产品分类: uniapp/小程序/微信

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 11

HBuilderX类型: 正式

HBuilderX版本号: 4.15

第三方开发者工具版本号: 1

基础库版本号: 1

项目创建方式: HBuilderX

操作步骤:

直接点击事件,报错

预期结果:

点击,调用子组件方法

实际结果:

点击报错

bug描述:

子组件defineExpose导出方法,父组件声明ref,赋值ref,方法调用.value.method,小程序报错,打印ref值为null

2024-06-05 10:13 负责人:无 分享
已邀请:

最佳回复

DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

问题已解决

技术分析

发现是判断当前文件是否为 App.vue 的时候逻辑不严谨,忽略了用户设置路由为 xxxApp.vue的情况,也就是你的 newApp.vue,使用通用的判断方案即可解决。下次发版生效

临时解决方案

你可以使用下面的附近,解压替换到 node_modules/@dcloudio/uni-cli-shared/dist/utils.js

如果是 hbuiderx 则是 HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-cli-shared/dist

如有问题,请继续反馈。

爱豆豆

爱豆豆 - 办法总比困难多

我这测试是可以正常调用子组件方法的 你可以发一下demo吗?帮你测一下

  • 30天内只能修改 (作者)

    <template>

    <view @click="open">

    test

    </view>

    <view @click="open2">

    test

    </view>

    <dialog-com ref="dia">

    <template #content>

    <view>1</view>

    </template>

    </dialog-com>

    <dialog-com ref="dia1">

    <template #content>

    <view>2</view>

    </template>

    </dialog-com>

    </template>


    <script setup>

    import {ref} from 'vue'

    import dialogCom from '/components/dialogCom/dialogCom.vue'

    const dia = ref()

    const dia1 = ref()

    function open(){

    dia.value.show()

    }

    function open2(){

    dia1.value.show()

    }

    </script>


    <style>


    </style>

    -------------------------------------子组件------------------------------------------

    <template>

    <view class="maskBox" v-if="isShow">

    <view class="contentBox">

    <image @click="isShow = false" class="closeIcon" style="width: 32rpx;height: 32rpx;" src="/static/close.png" mode=""></image>

    <view class="title fc-25 fs-36 fs-b">

    {{title}}

    </view>

    <slot name="content"></slot>

    <view class="btns">

    <view class="btn fs-32 fc-69 active" @click="emit('ok')">{{okText}}</view>

    <view class="btn" @click="emit('cancel')" v-if="showCalcel">{{cancelText}}</view>

    </view>

    </view>

    </view>

    </template>


    <script setup>

    import {

    ref,

    defineEmits,

    defineProps

    } from 'vue'

    const props = defineProps({

    okText: {

    type: String,

    default: () => '确定'

    },

    cancelText: {

    type: String,

    default: () => '取消'

    },

    title: String,

    default: () => '',

    showCalcel: Boolean,

    default: () => true,

    })

    const emit = defineEmits(['ok', 'cancel'])


    const isShow = ref(false)  
    function show(){
    isShow.value = true
    }
    function hide(){
    isShow.value = false
    }

    defineExpose({
    show,
    hide
    })

    </script>


    // <script>

    // export default {

    // props: {

    // okText: {

    // type: String,

    // default: () => '确定'

    // },

    // cancelText: {

    // type: String,

    // default: () => '取消'

    // },

    // title: String,

    // default: () => '',

    // showCalcel: Boolean,

    // default: () => true,

    // },

    // methods: {

    // show(){

    // isShow.value = true

    // },

    // hide(){

    // isShow.value = false

    // }

    // }

    // }

    // </script>


    <style lang="scss" scoped>

    .maskBox{

    .contentBox{

    position: relative;

    background: white;

    width: calc(100% - 64rpx);

    padding: 40rpx;

    .title{

    text-align: center;

    margin-top: 40rpx;

    margin-bottom: 24rpx;

    }

    .closeIcon{

    position: absolute;

    right: 20rpx;

    top: 20rpx;

    }

    }

    }

    .btns {

    display: flex;

    justify-content: space-around;

    align-items: center;

    .btn {

    font-size: 32rpx;

    font-weight: 500;

    margin-top: 32rpx;

    height: 88rpx;

    width: 254rpx;

    text-align: center;

    line-height: 88rpx;

    border-radius: 4rpx;

    border: 1rpx solid var(--borderC);

    flex: 1;

    &.active {

    color: #fff;

    background-color: var(--colorO);

    border: 1rpx solid var(--colorO);

    }

    }

    }

    </style>

    2024-06-05 11:11

  • 30天内只能修改 (作者)

    tabbar页面,其他页面正常。

    2024-06-05 11:14

爱豆豆

爱豆豆 - 办法总比困难多

在同样引入 dialogCom 组件的页面中 对比发现 编译后的文件中
只有newApp命名的文件 没有吧组件编译进去 导致组件无法使用

  • DCloud_UNI_OttoJi

    意思是,注册的 page 页面、组件,路由不能包含 newApp,我看下

    2024-06-06 14:38

  • 爱豆豆

    回复 DCloud_UNI_OttoJi: 我发了个复现项目压缩包 你可以直接运行到微信小程序 就能复现这个问题

    2024-06-06 14:56

  • DCloud_UNI_OttoJi

    回复 爱豆豆: 嗯嗯,我看到了,比心

    2024-06-06 15:02

DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

hbuilderx 创建的 vue3 运行到微信小程序平台。你提供下复现工程吧

爱豆豆

爱豆豆 - 办法总比困难多

运行你提供的代码片段后 也是可以正常调用子组件内的方法的
你建一个空项目吧你的代码复制进去 试试能不能复现 如果不能复现的话 应该是你项目内其他地方的问题了
你可把你现在的项目 去除敏感文件或配置后 打一个zip压缩包 发出来 我帮你测试下

  • 30天内只能修改 (作者)

    怎么给你发zip文件?

    2024-06-05 11:36

  • 爱豆豆

    回复 w***@163.com: 下面有个回复框 找到 上传附件 按钮 把文件发出来

    2024-06-05 11:42

  • 30天内只能修改 (作者)

    回复 爱豆豆: https://github.com/w569638598/saveCodeAsFile.git有个zip包,密码你给我发私信

    2024-06-05 11:56

  • 爱豆豆

    回复 30天内只能修改: 发不了 私信 你直接发密码吧

    2024-06-05 13:55

  • 30天内只能修改 (作者)

    回复 爱豆豆: yhs110

    2024-06-05 14:43

  • 30天内只能修改 (作者)

    回复 爱豆豆: 什么原因?

    2024-06-05 15:43

  • 30天内只能修改 (作者)

    回复 爱豆豆: 通知显示你回信息了,但是评论里面看不到???你3点46之后回复了吗?

    2024-06-05 17:31

  • 爱豆豆

    回复 30天内只能修改: 刚删了 又去验证了一遍回答 确保回答的准确性

    2024-06-05 17:38

  • 爱豆豆

    排查出来了 不是uniapp的问题 uni的编译是对的 在微信端只要是newApp命名的页面都无法使用自定义组件 也就没有ref 所以才报错了 小程序原生搭建的项目也会出现这个问题 所以属于微信小程序端的问题 可能这newApp是他们保留的关键词 你要去微信小程序的社区问下他们的官方人员了

    2024-06-05 17:38

  • 爱豆豆

    你目前的解决方法 跟你之前的回答一样 要改名字才行 不能用newApp命名

    2024-06-05 17:39

  • 爱豆豆

    我在微信文档中也没找到 newApp的关键词

    2024-06-05 17:40

  • 30天内只能修改 (作者)

    回复 爱豆豆: 但是你编译后组件的is=’components/dialogCom/dialogCom‘这个属性,为什么有的有,有的没有?

    2024-06-05 18:00

  • 爱豆豆

    回复 30天内只能修改: 好像又不是newApp名字的问题 我在微信开发者工具中 搭建代码片段 后 又可以使用了 还没找到原因 你可以自己排查一下

    2024-06-05 18:03

  • 30天内只能修改 (作者)

    回复 爱豆豆: 编译后组件的is=’components/dialogCom/dialogCom‘这个属性你能告诉为什么有的有有的没有吗?一样的代码。我不知道哪里写的有问题。排查半天了。

    2024-06-05 18:12

  • 爱豆豆

    回复 30天内只能修改: 不用排查了 是uniapp没编译进去 微信小程序端复现这个问题 原因是组件外层带了个text标签导致组件不现实 给我带偏了以为是微信小程序的问题 我已经给uniapp官方反馈了

    2024-06-05 18:44

  • 爱豆豆

    你可以看下编译后的微信小程序源码 里面的newApp.json没有引入所用到的组件

    2024-06-05 18:49

  • 30天内只能修改 (作者)

    回复 爱豆豆: 组件外层带了个text标签,你这个组件外层指的是哪里?好的,感谢帮忙排查问题。

    2024-06-06 09:06

  • 爱豆豆

    回复 30天内只能修改: 跟你这个没关系 是我写错了 以为是微信小程序的原因

    2024-06-06 09:40

30天内只能修改

30天内只能修改 (作者)

@DCloud_UNI_OttoJi 你看截图,newApp。test,和另外一个文件夹里的test,这3个代码完全一样复制的。newApp原来是真实业务代码,后来我复制了一份,起名newAppcopy。然后把tabbar改成这个newAppcopy,发现newAppcopy可以用了。但是newApp不管是之前的真实业务代码,还是用来测试这个调用子组件方法的demo代码,都不能用。hb和微信小程序开发工具都已经重启了。最后两张是便宜后微信的文件代码,一个有is=’components/dialogCom/dialogCom‘,一个没有,但是俩代码完全一样。@爱豆豆

爱豆豆

爱豆豆 - 办法总比困难多

@DCloud_UNI_OttoJi
你看下复现的demo 小程序端哦

DCloud

DCloud

HBuilderX 4.21.2024061818-alpha 已修复。

要回复问题请先登录注册