4***@qq.com
4***@qq.com
  • 发布:2024-08-22 14:51
  • 更新:2024-08-23 15:04
  • 阅读:370

【报Bug】uniapp开发小程序页面真机渲染卡顿

分类:uni-app

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

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 版本 Windows 11 专业版 版本 21H2 安装日期 ‎2023-‎04-‎18 操作系统版本 22000.2538 体验 Windows 功能体验包 1000.22001.1000.0

HBuilderX类型: 正式

HBuilderX版本号: 4.24

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

基础库版本号: 3.5.1

项目创建方式: HBuilderX

示例代码:

列表页面

    <view class="ranking-home bg-white" :class="title == '心理测评榜' ? 'img1' : title == '免费测评榜' ? 'img2' : '' ">  
        <view class="bg1"></view>  
        <view class="bg2"></view>  
        <view class="bg-title">  
            <view class="name">{{ title }} TOP30</view>  
            <view class="label">HOT LIST</view>  
        </view>  
        <view class="app-index list-box">  
            <view class="app-loader mt25" v-if="!pageData.list">  
                <view class="loader"></view>  
            </view>  
            <view v-else class="app-container_main mt25">  
                <!-- v-for 循环放在这里 -->  
                <view v-for="(item, index) in pageData.list" :key="index">  
                    <ranking-card :item="item" :index="index"></ranking-card>  
                </view>  
                <view class="app-loader" v-if="pageData.list.length > 0">  
                    <view class="loader" v-if="pageData.loading"></view>  
                    <view class="load" v-else>已经到底了</view>  
                </view>  
            </view>  
        </view>  
    </view>  
</template>  

<script setup>  
    import {  
        ref  
    } from 'vue';  
    import {  
        request  
    } from '@/apis/request.js';  
    import {  
        onLoad,  
        onReachBottom  
    } from '@dcloudio/uni-app';  

    import rankingCard from '@/components/ranking-card.vue';  

    const title = ref('');  
    const pageData = ref({  
        url: '',  
        list: null,  
        typeId: '',  
        limit: 10,  
        page: 1,  
        recommend: 1,  
        isHot: 1,  
        loading: true,  
    });  

    const getContentlist = async (e) => {  
        if (e) {  
            pageData.value.list = null;  
            pageData.value.page = 1;  
            pageData.value.loading = true;  
        }  

        const data = {  
            typeId: pageData.value.typeId,  
            limit: pageData.value.limit,  
            recommend: pageData.value.recommend,  
            isHot: pageData.value.isHot,  
            page: pageData.value.page,  
        };  
        try {  
            const response = await request(pageData.value.url, data);  
            if (e) {  
                pageData.value.list = response.page.list;  
            } else {  
                pageData.value.list = [...pageData.value.list, ...response.page.list];  
            }  

            if (pageData.value.page >= response.page.totalPage || pageData.value.page >= 3) {  
                pageData.value.loading = false;  
            } else {  
                pageData.value.page += 1;  
            }  
        } catch (error) {  
            console.error('Failed to fetch data:', error);  
            pageData.value.loading = false;  
        }  
    };  

    onLoad(async (option) => {  
        switch (option.type) {  
            case 'article':  
                uni.setNavigationBarTitle({  
                    title: '热门文章'  
                });  
                title.value = '心理宝典榜';  
                pageData.value.url = '/wap/getContentlist';  
                break;  
            case 'free':  
                uni.setNavigationBarTitle({  
                    title: '免费测评'  
                });  
                title.value = '免费测评榜';  
                pageData.value.url = '/wap/getEvaluationList';  
                pageData.value.typeId = -1;  
                pageData.value.recommend = 0;  
                break;  
            default:  
                uni.setNavigationBarTitle({  
                    title: '推荐测评'  
                });  
                title.value = '心理测评榜';  
                pageData.value.url = '/wap/getEvaluationList';  
        }  

        await getContentlist(true);  
    });  

    onReachBottom(() => {  
        if (pageData.value.loading) {  
            getContentlist();  
        }  
    });  
</script>

组件页面

<template>  
  <view class="article-card_container">  
    <view class="article-card app-hover" @click="onContent(item.contentType ? '/pages/article/content/content?id=' + item.id : '/pages/test/content/content?id=' + item.id)">  
      <view class="img">  
        <image class="icon" mode="aspectFill" :src="item.thumbnail || item.img"></image>  
        <view class="type" v-if="item.contentType || item.typeName">  
          {{ item.contentType || item.typeName }}  
        </view>  
       <view class="index" :class="index === 0 ? 'on1' : index === 1 ? 'on2' : index === 2 ? 'on3' : '' ">{{index + 1}}</view>  
      </view>  
      <view class="main">  
        <view class="title">{{ item.title }}</view>  
        <view class="summary">{{ item.summary }}</view>  
        <view class="foot" v-if="item.contentType">{{ item.author }}</view>  
        <view class="foot" v-else>  
          <view class="price" v-if="item.price * 1 > 0"><text>¥</text>{{ item.price }}</view>  
          <view class="free" v-else>免费</view>  
          <view class="init" v-if="item.initPrice"><text>¥</text>{{ item.initPrice }}</view>  
          <view class="btn">立即测试</view>  
        </view>  
      </view>  
    </view>  
  </view>  
</template>  

<script setup>  
import appEmpty from './app-empty.vue';  

const props = defineProps({  
  item: {  
    type: Object,  
    required: true,  
  },  
  index: {  
    type: Number,  
    required: true,  
  },  
});  

const onContent = (url) => {  
  uni.navigateTo({ url });  
};  
</script>

操作步骤:

目前我尝试了,微信小程序、抖音小程序真机渲染页面卡顿。
给图片添加 lazy-load 属性也试过了,没用。
也不可能是我图片太大的原因,因为这些都是测试数据,我找了几张小的图片测试的。

预期结果:

顺畅浏览

实际结果:

卡顿卡成PPT了

bug描述:

<iframe height=498 width=510 src="https://player.youku.com/embed/XNjQxNjYwMTcyOA==" frameborder=0 allowfullscreen></iframe>

观看视频

2024-08-22 14:51 负责人:无 分享
已邀请:
4***@qq.com

4***@qq.com (作者)

问题找到了。不是v-if的问题。问题是出在css样式backdrop-filter,不支持或吃性能。

爱豆豆

爱豆豆 - 办法总比困难多

你把图片先删掉不显示 把v-if改v-show 试试会不会卡顿 排查下是不是图片的原因
列表中的图片多大?

  • 4***@qq.com (作者)

    图片只有5kb,不是图片的问题。目前试了一下是v-if的原因,我把所有v-if注释就不卡顿了。但是用v-show一样卡。。。。

    2024-08-22 15:19

BFC

BFC

你好,尝试调整一下 v-for的key值, key不要设置index, 设置为数据项的唯一id

要回复问题请先登录注册