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

13 回复

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

更多关于uni-app vue3项目,抖音小程序的子组件渲染存在bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html


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

<slot></slot>
</template> <script> export default { props: { btnClass: { type: String, default: '' } }, created() { console.log(this.btnClass); } }; </script>

回复 专业逮虾户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 的某些特性不兼容。
  • 解决方案

    • 检查生命周期钩子:确保子组件的生命周期钩子(如 onMountedonUpdated)正确触发。
    • 使用 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 的变化,手动触发更新。
    • 使用 refreactive:确保数据使用 refreactive 进行响应式处理。
    <template>
      <ChildComponent :data="data" />
    </template>
    
    <script setup>
    import { ref } from 'vue';
    const data = ref({});
    
    setTimeout(() => {
      data.value = { newData: 'new value' };
    }, 1000);
    </script>
回到顶部