uni-app vue3项目,抖音小程序的子组件渲染存在bug
uni-app vue3项目,抖音小程序的子组件渲染存在bug
产品分类:
uniapp/小程序/字节跳动
操作系统:
Windows
操作系统版本号:
windows11 22621.3155
HBuilderX类型:
正式
HBuilderX版本号:
3.99
第三方开发者工具版本号:
4.2.0
基础库版本号:
3.11
项目创建方式:
HBuilderX
示例代码:
<p>子组件代码:</p>
<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>
<p>父组件引用方式:</p>
<tc-button btnClass="primary small">{{title}}</tc-button>
更多关于uni-app vue3项目,抖音小程序的子组件渲染存在bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html
抖音小程序的组件初始化父子关系较晚,在setup阶段,还没有初始化父子关系,导致首次渲染的时候可能还没有拿到props,你可以用options方式定义props试试。
更多关于uni-app vue3项目,抖音小程序的子组件渲染存在bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html
有考虑过这种可能,我也使用option的写法尝试过了,在created的时候是能够正常打印的,但是还是会有一样的问题哈~ <template>
回复 专业逮虾户aaa:我这边使用options方式测试是可以的
回复 YUANRJ: 方便发一下测试项目或代码片段嘛?
回复 专业逮虾户aaa: 就是用的你的代码
回复 YUANRJ: 我觉得可能是之前定义的样式不明显,闪的太快了,没感受到vue2和vue3版本渲染区别。我重新上传了一份整个demo项目的代码在评论区~
我再捞一下这个贴,想问一下还有其他的可以规避的方案嘛
这份代码运行之后,每次刷新抖音的页面时,可以很明显的看到按钮字体变大闪了一下
此问题在vue2也会出现,抖音小程序,当出现多层嵌套组件时,拿到的props值为空。
vue2多层组件我没有试过,不过单层的话没有出现过这个问题
【报Bug】抖音小程序,嵌套组件拿到的props为null https://ask.dcloud.net.cn/question/189702
看这个bug
在 uni-app 项目中使用 Vue3 开发抖音小程序时,可能会遇到子组件渲染的 bug。以下是一些常见问题及可能的解决方案:
1. 子组件未渲染或渲染异常
-
问题描述:子组件在抖音小程序中未渲染或渲染异常,但在其他平台(如 H5、微信小程序)正常。
-
可能原因:
- 抖音小程序对
Vue3的支持可能存在一些兼容性问题。 - 子组件的生命周期钩子未正确触发。
- 抖音小程序的渲染机制与
Vue3的某些特性不兼容。
- 抖音小程序对
-
解决方案:
- 检查生命周期钩子:确保子组件的生命周期钩子(如
onMounted、onUpdated)正确触发。 - 使用
v-if控制渲染:尝试使用v-if控制子组件的渲染,确保在合适的时机渲染子组件。 - 简化子组件:将子组件简化,逐步排除问题,看看是否与某些特定逻辑或样式有关。
- 使用
key强制重新渲染:如果子组件依赖于动态数据,尝试使用key属性强制重新渲染子组件。
<template> <ChildComponent :key="componentKey" /> </template> <script setup> import { ref } from 'vue'; const componentKey = ref(0); const refreshComponent = () => { componentKey.value++; }; </script> - 检查生命周期钩子:确保子组件的生命周期钩子(如
2. 子组件样式丢失或错乱
- 问题描述:子组件的样式在小程序中丢失或错乱,但在其他平台正常。
- 可能原因:
- 抖音小程序对某些 CSS 属性的支持有限。
- 样式作用域问题,导致样式未正确应用到子组件。
- 样式冲突或覆盖。
- 解决方案:
- 检查 CSS 兼容性:确保使用的 CSS 属性在抖音小程序中受支持。
- 使用
scoped样式:在父组件中使用scoped样式,避免样式冲突。 - 使用
!important:如果样式被覆盖,可以尝试使用!important强制应用样式。 - 使用全局样式:如果样式未正确应用,可以尝试将样式放在全局样式中。
3. 子组件事件未触发
-
问题描述:子组件中的事件(如
click)未触发,但在其他平台正常。 -
可能原因:
- 抖音小程序对事件绑定的支持存在问题。
- 事件冒泡或捕获机制与
Vue3不兼容。
-
解决方案:
- 检查事件绑定:确保事件绑定语法正确,如
@click。 - 使用原生事件:尝试使用原生事件(如
bindtap)代替Vue的事件绑定。 - 手动绑定事件:在
mounted钩子中手动绑定事件。
<template> <view @click="handleClick">Click me</view> </template> <script setup> const handleClick = () => { console.log('Clicked'); }; </script> - 检查事件绑定:确保事件绑定语法正确,如
4. 子组件数据未更新
-
问题描述:子组件的数据未更新,但在其他平台正常。
-
可能原因:
- 抖音小程序对
Vue3的响应式系统支持存在问题。 - 父组件传递给子组件的
props未正确更新。
- 抖音小程序对
-
解决方案:
- 检查
props传递:确保父组件传递给子组件的props正确更新。 - 使用
watch监听props:在子组件中使用watch监听props的变化,手动触发更新。 - 使用
ref或reactive:确保数据使用ref或reactive进行响应式处理。
<template> <ChildComponent :data="data" /> </template> <script setup> import { ref } from 'vue'; const data = ref({}); setTimeout(() => { data.value = { newData: 'new value' }; }, 1000); </script> - 检查

