专业逮虾户aaa
专业逮虾户aaa
  • 发布:2024-03-05 10:41
  • 更新:2024-04-16 13:16
  • 阅读:326

【报Bug】vue3项目,抖音小程序的子组件渲染有bug

分类:uni-app

产品分类: uniapp/小程序/字节跳动

PC开发环境操作系统: Windows

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

HBuilderX类型: 正式

HBuilderX版本号: 3.99

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

基础库版本号: 3.11

项目创建方式: HBuilderX

示例代码:

子组件代码:

<template>  
  <div class="tc-button" :class="btnClass">  
    <slot></slot>  
  </div>  
</template>  
<script setup>  
/* 声明 start */  
const props = defineProps({  
  btnClass: {  
    type: String,  
    default: '',  
  },  
});  
const {btnClass} = props  
/* 声明 end */  
</script>  

<style>  
.tc-button {  
  display: inline-flex;  
  justify-content: center;  
  align-items: center;  
  text-decoration: none;  
  white-space: nowrap;  
  border-radius: 8rpx;  
  box-sizing: border-box;  
  font-size: 100rpx;  
}  
.tc-button {  
  border: none;  
}  
.tc-button.large {  
  width: 335rpx;  
  height: 88rpx;  
  font-size: 32rpx;  
  line-height: 48rpx;  
  font-weight: bold;  
}  
.tc-button.large.round {  
  border-radius: 44rpx;  
}  
.tc-button.medium {  
  padding: 0 32rpx;  
  height: 68rpx;  
  font-size: 28rpx;  
  line-height: 68rpx;  
}  
.tc-button.medium.round {  
  border-radius: 34rpx;  
}  
.tc-button.small {  
  padding: 0 28rpx;  
  min-width: 112rpx;  
  height: 56rpx;  
  line-height: 56rpx;  
  font-size: 24rpx;  
}  
.tc-button.small.round {  
  border-radius: 28rpx;  
}  
.tc-button.mini {  
  padding: 0 20rpx;  
  height: 44rpx;  
  font-size: 20rpx;  
  line-height: 44rpx;  
}  
.tc-button.mini.round {  
  border-radius: 22rpx;  
}  
.tc-button.primary {  
  color: #333333;  
  background-color: #ffd850;  
}  
</style>

父组件引用方式:

<tc-button btnClass="primary small">{{title}}</tc-button>

操作步骤:

1、使用这个npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project或者HBuilderX创建vue3项目
2、把我上面贴的组件代码放到新项目中
3、npm run dev:mp-toutiao 运行抖音小程序
这样就可以看到和视频中医院的效果:子组件渲染有很明显的过渡问题

预期结果:

期望跟视频右边的vue2表现一致

实际结果:

实际结果如视频左边的vue3

bug描述:

vue3项目,抖音小程序的子组件渲染有bug,开发工具和真机都可以重现。
1、用的HBuilderX、cli和开发工具都是目前最新的版本
2、vue2项目不会,vue3项目在微信小程序也不会,就只有vue3项目在抖音小程序会出现这个问题
下面是图片和视频分析:
左边是vue3的表现,右边是vue2的表现。
可以看到vue3有一帧是有问题的,这是因为子组件初始化的时候,没有拿到父组件传进来的props就渲染了(即使是静态的props也拿不到,类似于<test-component testVal="测试" />这种写法)
3、iOS真机上偶尔还会丢失props(也是静态的props)

2024-03-05 10:41 负责人:无 分享
已邀请:
YUANRJ

YUANRJ

抖音小程序的组件初始化父子关系较晚,在setup阶段,还没有初始化父子关系,导致首次渲染的时候可能还没有拿到props,你可以用options方式定义props试试。

  • 专业逮虾户aaa (作者)

    有考虑过这种可能,我也使用option的写法尝试过了,在created的时候是能够正常打印的,但是还是会有一样的问题哈~

    <template>

    <div class="tc-button" :class="btnClass">

    <slot></slot>

    </div>

    </template>

    <script>

    export default {

    props: {

    btnClass: {

    type: String,

    default: ''

    }

    },

    created() {

    console.log(this.btnClass);

    }

    };

    </script>

    2024-03-05 12:30

  • YUANRJ

    回复 专业逮虾户aaa:我这边使用options方式测试是可以的

    2024-03-07 10:49

  • 专业逮虾户aaa (作者)

    回复 YUANRJ: 方便发一下测试项目或代码片段嘛?

    2024-03-07 11:28

  • YUANRJ

    回复 专业逮虾户aaa: 就是用的你的代码

    2024-03-07 13:15

  • 专业逮虾户aaa (作者)

    回复 YUANRJ: 我觉得可能是之前定义的样式不明显,闪的太快了,没感受到vue2和vue3版本渲染区别。我重新上传了一份整个demo项目的代码在评论区~

    2024-03-08 09:50

专业逮虾户aaa

专业逮虾户aaa (作者) - 喜欢分享创新和实用性强的想法

我再捞一下这个贴,想问一下还有其他的可以规避的方案嘛

专业逮虾户aaa

专业逮虾户aaa (作者) - 喜欢分享创新和实用性强的想法

这份代码运行之后,每次刷新抖音的页面时,可以很明显的看到按钮字体变大闪了一下

年少的张三丰

年少的张三丰

此问题在vue2也会出现,抖音小程序,当出现多层嵌套组件时,拿到的props值为空。

  • 专业逮虾户aaa (作者)

    vue2多层组件我没有试过,不过单层的话没有出现过这个问题

    2024-05-09 15:58

  • 年少的张三丰

    【报Bug】抖音小程序,嵌套组件拿到的props为null

    https://ask.dcloud.net.cn/question/189702


    看这个bug

    2024-05-10 09:24

要回复问题请先登录注册