You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3配合vue-router如何让非活动视图保持挂载以维持音频播放?

实现方案

核心逻辑是将需要保持挂载的路由组件全程保留在DOM树中,仅通过CSS控制显隐,完全避免组件卸载,可根据你的实际需求选择以下两种实现方式:

方式一:少量路由保活(推荐适配你的音频播放场景)

如果仅需要给Play这类少数路由保持挂载,直接手动渲染组件配合v-show控制显隐即可,实现零成本:

<template>
  <!-- 音频播放组件永久挂载,仅匹配对应路由时显示 -->
  <Play v-show="$route.name === 'Play'" />
  <!-- 其他普通路由正常走默认路由渲染逻辑 -->
  <router-view v-slot="{ Component }" v-if="$route.name !== 'Play'">
    <component :is="Component" />
  </router-view>
</template>

<script setup>
import Play from './views/Play.vue'
</script>

该方案下Play组件永远不会被卸载,切换路由时只会触发显隐状态变更,音频播放不会中断。

方式二:多路由批量保活

如果有多个路由都需要保持挂载,可以统一配置保活路由列表,实现通用处理:

<template>
  <!-- 批量渲染所有需要保活的路由组件 -->
  <template v-for="route in keepMountedRouteList" :key="route.name">
    <component 
      :is="route.component" 
      v-show="$route.name === route.name" 
    />
  </template>
  <!-- 非保活路由走正常渲染逻辑 -->
  <router-view v-slot="{ Component }" v-if="!currentIsKeepMounted">
    <component :is="Component" />
  </router-view>
</template>

<script setup>
import { computed } from 'vue'
import { useRoute } from 'vue-router'
// 引入所有需要保活的路由组件
import Play from './views/Play.vue'
import LiveRoom from './views/LiveRoom.vue'

// 配置保活路由列表
const keepMountedRouteList = [
  { name: 'Play', component: Play },
  { name: 'LiveRoom', component: LiveRoom }
]

const route = useRoute()
// 判断当前路由是否属于保活路由
const currentIsKeepMounted = computed(() => {
  return keepMountedRouteList.some(item => item.name === route.name)
})
</script>

注意事项

  • 保活组件如果需要响应路由参数变化,可直接监听$route对象的变更更新内部状态,和普通路由组件的处理逻辑一致。
  • 保活组件会持续占用内存,建议仅给确实需要避免卸载的场景开启,普通页面仍走默认的路由销毁逻辑即可。
  • 如果需要在组件显隐时执行自定义逻辑,可以监听当前路由是否匹配组件路由来触发对应操作。

内容的提问来源于stack exchange,提问作者Marcel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:24:01