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 @@