AI篮球分析系统:用机器学习重塑投篮训练的科学方法
2025/12/18 14:44:48
实现 XML 文件预览功能,支持超过 10000 行的大文件预览,具备高性能和良好用户体验。
transform提升渲染性能constLINE_HEIGHT=20// 每行高度(px)constBUFFER_SIZE=20// 缓冲区域行数// 起始索引:当前滚动位置对应的起始行号减去缓冲区startIndex=Math.max(0,Math.floor(scrollTop/LINE_HEIGHT)-BUFFER_SIZE)// 结束索引:可视区域行数加上缓冲区两倍大小endIndex=Math.min(totalLines,startIndex+Math.ceil(containerHeight/LINE_HEIGHT)+BUFFER_SIZE*2)// 偏移量:用于定位可视区域offsetY=startIndex*LINE_HEIGHT<template> <div class="file-viewer-container"> <!-- 虚拟滚动容器 --> <div ref="scrollContainer" @scroll="handleScroll"> <!-- 占位符撑开总高度 --> <div :style="{ height: totalHeight + 'px' }" class="scroll-placeholder"> <!-- 可见内容区域 --> <div :style="{ transform: `translateY(${offsetY}px)` }" class="visible-content"> <pre v-for="line in visibleLines" :key="index">{{ line }}</pre> </div> </div> </div> <!-- 底部信息栏 --> <div class="file-info"> <!-- 行数统计、搜索控件等 --> </div> </div> </template>data(){return{searchResults:[],// 存储所有匹配行号currentSearchIndex:-1,// 当前查看的结果索引activeSearchIndex:-1// 当前高亮显示的行号}}performSearchsearchResultsscrollToLine定位并高亮显示scrollToLine(lineNumber){// 目标位置consttargetTop=lineNumber*LINE_HEIGHT// 居中显示计算constmiddlePosition=targetTop-this.containerHeight/2// 同步更新虚拟滚动和真实DOMthis.$refs.scrollContainer.scrollTop=Math.max(0,middlePosition)this.scrollTop=Math.max(0,middlePosition)}will-change: transform提示浏览器优化@scroll事件节流处理computed:{// 起始索引startIndex(){returnMath.max(0,Math.floor(this.scrollTop/LINE_HEIGHT)-BUFFER_SIZE)},// 结束索引endIndex(){constvisibleCount=Math.ceil(this.containerHeight/LINE_HEIGHT)+BUFFER_SIZE*2returnMath.min(this.linesNum,this.startIndex+visibleCount)},// 可见行内容visibleLines(){returnthis.xmlContent.slice(this.startIndex,this.endIndex)},// 偏移量offsetY(){returnthis.startIndex*LINE_HEIGHT}}methods:{// 执行搜索performSearch(){this.searchResults=[]this.xmlContent.forEach((line,index)=>{if(line.includes(this.searchText)){this.searchResults.push(index)}})if(this.searchResults.length>0){this.currentSearchIndex=0this.scrollToLine(this.searchResults[0])}},// 导航到下一个匹配项searchNext(){this.currentSearchIndex=(this.currentSearchIndex+1)%this.searchResults.lengththis.scrollToLine(this.searchResults[this.currentSearchIndex])}}