From 1a62ec6658b122a4d25bd43a80c8ca40a09c5568 Mon Sep 17 00:00:00 2001 From: Fam Zheng Date: Mon, 25 May 2026 10:39:49 +0100 Subject: [PATCH] =?UTF-8?q?music(player):=20=E5=88=87=E6=AD=8C=E4=B8=8D?= =?UTF-8?q?=E6=89=93=E6=89=B0=20=E2=80=94=20=E6=9A=82=E5=81=9C=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=88=87=E5=88=AB=E7=9A=84=E4=B8=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=BC=80=E6=92=AD=20+=20tab=20=E4=BF=9D=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - loadPiece 进来先 snapshot wasPlaying / stickyTab - 新 piece 也有同样 tab 就保持(chord/notes/简谱…),否则才回第一个 - 只有切歌前 audio 正在播才 .play();暂停 / 第一次进入 → 只 set src 等用户点 ▶ - 整理 notes / 看和弦谱的场景从此不会被切歌打断 --- apps/music/frontend/src/views/PlayerView.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/music/frontend/src/views/PlayerView.vue b/apps/music/frontend/src/views/PlayerView.vue index 7c752f3..fd29ae9 100644 --- a/apps/music/frontend/src/views/PlayerView.vue +++ b/apps/music/frontend/src/views/PlayerView.vue @@ -740,6 +740,10 @@ async function promptNewPlaylist() { } async function loadPiece(id) { + // 切歌前记下当前是否在播 + tab 在哪 —— 整理 notes / 看和弦谱 时不打扰 + const wasPlaying = !!(audioEl.value && !audioEl.value.paused && !audioEl.value.ended) + const stickyTab = activeTab.value // 保持用户当前看的 tab(如果新 piece 也有) + selected.value = null notesDraft.value = '' // 切歌清 AB Loop(rate 保留全局) @@ -757,15 +761,19 @@ async function loadPiece(id) { selected.value = p notesDraft.value = p.notes || '' selectedId.value = p.id + // tab 保持:sticky 在新 piece 也存在就用它,否则用第一个 const t = tabs.value - if (!t.find(x => x.key === activeTab.value)) { + if (t.find(x => x.key === stickyTab)) { + activeTab.value = stickyTab + } else { activeTab.value = t[0]?.key || 'lyrics' } await nextTick() const first = audioAttachments.value[0] if (first && audioEl.value) { audioEl.value.src = attUrl(first.id) - audioEl.value.play().catch(() => {}) + // 只有上一首在播才自动续播;暂停状态 / 第一次进入 → 只设源,等用户点 ▶ + if (wasPlaying) audioEl.value.play().catch(() => {}) } else if (audioEl.value) { audioEl.value.removeAttribute('src') audioEl.value.load()