From 8994b4a1d27c0a99466752554a6f675675160aca Mon Sep 17 00:00:00 2001 From: zhangyh Date: Fri, 17 Oct 2025 17:09:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E6=97=B6=E7=9A=84=E6=A0=B7=E5=BC=8F=E5=92=8C?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asistant/components/AudioVisualizer.vue | 59 ++++++++++++- src/views/asistant/components/InputArea.vue | 83 +++++++++++++++---- src/views/asistant/index.vue | 24 +----- src/views/stylist/index.vue | 60 ++++++-------- 4 files changed, 147 insertions(+), 79 deletions(-) diff --git a/src/views/asistant/components/AudioVisualizer.vue b/src/views/asistant/components/AudioVisualizer.vue index e3b3de4..f983c8a 100644 --- a/src/views/asistant/components/AudioVisualizer.vue +++ b/src/views/asistant/components/AudioVisualizer.vue @@ -1,7 +1,13 @@ @@ -17,12 +23,17 @@ interface Line { const containerRef = ref() const visualizerRef = ref() const lines = ref([]) +const isInitialized = ref(false) +let resizeObserver: ResizeObserver | null = null // 计算需要的线条数量 const calculateLines = (): Line[] => { if (!visualizerRef.value) return [] const containerWidth = visualizerRef.value.offsetWidth + + // 如果容器宽度为0或很小,说明还没有正确渲染,返回空数组 + if (containerWidth < 50) return [] const lineWidth = 0.96 // 每条线的宽度 (rem) const gap = 0.96 // 线条之间的间距 (rem) @@ -66,7 +77,7 @@ const calculateLines = (): Line[] => { // 生成一个完整周期的内容 const oneCycle: Line[] = [] oneCycle.push(...basePattern) - + // 添加重复模式直到填满一个周期 let currentIndex = basePattern.length while (currentIndex < linesNeeded) { @@ -91,9 +102,18 @@ const calculateLines = (): Line[] => { // 更新线条 const updateLines = () => { - lines.value = calculateLines() + const newLines = calculateLines() + if (newLines.length > 0) { + lines.value = newLines + isInitialized.value = true + } } +// 暴露方法给父组件 +defineExpose({ + updateLines +}) + // 监听窗口大小变化 const handleResize = () => { updateLines() @@ -101,12 +121,45 @@ const handleResize = () => { onMounted(async () => { await nextTick() + + // 立即尝试第一次更新 updateLines() + + // 如果第一次没有成功,快速重试 + setTimeout(() => { + if (!isInitialized.value) { + updateLines() + } + }, 50) + + // 最后的备用尝试 + setTimeout(() => { + if (!isInitialized.value) { + updateLines() + } + }, 150) + + // 使用ResizeObserver监听容器大小变化,更精确地检测初始化时机 + if (visualizerRef.value && window.ResizeObserver) { + resizeObserver = new ResizeObserver((entries) => { + for (const entry of entries) { + if (entry.contentRect.width > 50 && !isInitialized.value) { + updateLines() + } + } + }) + resizeObserver.observe(visualizerRef.value) + } + window.addEventListener('resize', handleResize) }) onUnmounted(() => { window.removeEventListener('resize', handleResize) + if (resizeObserver) { + resizeObserver.disconnect() + resizeObserver = null + } }) diff --git a/src/views/asistant/components/InputArea.vue b/src/views/asistant/components/InputArea.vue index a04ffdc..b341d4b 100644 --- a/src/views/asistant/components/InputArea.vue +++ b/src/views/asistant/components/InputArea.vue @@ -21,18 +21,20 @@
- + @keydown="handleKeyDown" + @input="handleInput" + ref="textareaRef" + >
- +
@@ -51,13 +53,16 @@