(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 @@
@@ -51,13 +53,16 @@