import { useState, useMemo } from 'react'; import { Box, Container, TextField, Grid, Paper, Typography, alpha } from '@mui/material'; import PageHeader from '@/components/PageHeader'; import DescriptionIcon from '@mui/icons-material/Description'; import { getTextStats, formatByteSize } from '@/utils/textStatistics'; import { textStatisticsPageStyles } from '@/config/pageTheme'; /** * 文本统计页面组件 * * 提供实时的文本分析功能,包括字符数、单词数、行数和字节大小。 */ export default function TextStatisticsPage() { const [text, setText] = useState(''); // 实时计算统计信息,使用 useMemo 优化性能 // 对于 10,000 字符以上的文本,Intl.Segmenter 也能保持良好的性能 const stats = useMemo(() => getTextStats(text), [text]); const statItems = [ { label: '字符数', value: stats.characters }, { label: '单词数', value: stats.words }, { label: '行数', value: stats.lines }, { label: '字节大小', value: formatByteSize(stats.bytes) }, ]; return ( {/* 头部区域 */} } iconColor={textStatisticsPageStyles.primaryColor} /> {/* 文本输入区域 */} setText(e.target.value)} sx={{ mb: 3, '& .MuiOutlinedInput-root': { borderRadius: 4, bgcolor: 'grey.50', transition: 'all 0.2s', '& fieldset': { borderColor: 'grey.200', }, '&:hover fieldset': { borderColor: 'grey.300', }, '&.Mui-focused fieldset': { borderColor: textStatisticsPageStyles.primaryColor, }, }, '& .MuiInputBase-input': { fontSize: '0.9rem', lineHeight: 1.6, }, }} /> {/* 统计结果展示区域 */} {statItems.map((item) => ( `0 4px 12px ${alpha(textStatisticsPageStyles.primaryColor, 0.15)}`, borderColor: textStatisticsPageStyles.primaryColor, }, lineHeight: 1.6, fontSize: '0.9rem', fontWeight: 600, }} > {item.label} {item.value} ))} ); }