feat: 定位到组件异常渲染的问题

This commit is contained in:
2025-11-15 20:23:15 +08:00
parent d427b9323c
commit 2a8c337b72
6 changed files with 251 additions and 160 deletions

View File

@@ -8,7 +8,7 @@ import { setStorage, getStorage } from "@/store/storage";
import { NTRPTestEntryCard } from "@/components";
import { EvaluateScene } from "@/store/evaluateStore";
import "./index.scss";
import { useRef, useEffect, useState } from "react";
import { useRef, useEffect, useState, useMemo } from "react";
const ListContainer = (props) => {
const {
@@ -26,6 +26,7 @@ const ListContainer = (props) => {
style,
collapse = false,
defaultShowNum,
evaluateFlag,
} = props;
const timerRef = useRef<NodeJS.Timeout | null>(null);
const loadingStartTimeRef = useRef<number | null>(null);
@@ -47,19 +48,17 @@ const ListContainer = (props) => {
});
useEffect(() => {
setShowNumber(
() => {
return defaultShowNum === undefined ? data?.length : defaultShowNum
})
}, [data])
setShowNumber(() => {
return defaultShowNum === undefined ? data?.length : defaultShowNum;
});
}, [data]);
// 控制骨架屏显示逻辑
useEffect(() => {
if (loading) {
// 开始加载时记录时间
loadingStartTimeRef.current = Date.now();
// 延迟 300ms 后再显示骨架屏
skeletonTimerRef.current = setTimeout(() => {
setShowSkeleton(true);
@@ -102,6 +101,7 @@ const ListContainer = (props) => {
// 对于没有ntrp等级的用户每个月展示一次, 插在第三个位置
function insertEvaluateCard(list) {
if (!evaluateFlag) return list;
if (!list || list.length === 0) {
return list;
}
@@ -122,6 +122,11 @@ const ListContainer = (props) => {
return [item1, item2, item3, { type: "evaluateCard" }, ...rest];
}
const memoizedList = useMemo(
() => insertEvaluateCard(data),
[evaluateFlag, data, userInfo.ntrp_level]
);
// 渲染列表
const renderList = (list) => {
// 请求数据为空
@@ -137,12 +142,12 @@ const ListContainer = (props) => {
);
}
showNumber !== undefined && (list = list.slice(0, showNumber))
showNumber !== undefined && (list = list.slice(0, showNumber));
// 渲染数据
return (
<>
{insertEvaluateCard(list).map((match, index) => {
{memoizedList.map((match, index) => {
if (match.type === "evaluateCard") {
return (
<NTRPTestEntryCard key="evaluate" type={EvaluateScene.list} />
@@ -164,20 +169,33 @@ const ListContainer = (props) => {
</View>
{renderList(recommendList)} */}
{/* 到底了 */}
{collapse ?
data?.length > defaultShowNum ?
data?.length > showNumber ?
<View className="collapse-btn fold" onClick={() => { setShowNumber(data?.length) }}>
{collapse ? (
data?.length > defaultShowNum ? (
data?.length > showNumber ? (
<View
className="collapse-btn fold"
onClick={() => {
setShowNumber(data?.length);
}}
>
<Text></Text>
<Image src={require("@/static/userInfo/fold.svg")}></Image>
</View> :
<View className="collapse-btn" onClick={() => { setShowNumber(defaultShowNum) }}>
</View>
) : (
<View
className="collapse-btn"
onClick={() => {
setShowNumber(defaultShowNum);
}}
>
<Text></Text>
<Image src={require("@/static/userInfo/fold.svg")}></Image>
</View>
:
null
: data?.length > 0 && <View className="bottomTextWrapper"></View>}
)
) : null
) : (
data?.length > 0 && <View className="bottomTextWrapper"></View>
)}
</View>
);
};