feat: 更新视频播放器组件,添加章节视频功能并优化返回逻辑

This commit is contained in:
2026-04-09 16:48:57 +08:00
parent 943cc862fc
commit 17022d498a
19 changed files with 1192 additions and 1599 deletions

View File

@@ -0,0 +1 @@
export const BEFORE_NAVIGATE_BACK_EVENT = '__edu_before_navigate_back__'

View File

@@ -15,8 +15,9 @@
<script setup>
import { getStatusBarHeight, getTitleBarHeight, getNavBarHeight } from "@/utils/system"
import { BEFORE_NAVIGATE_BACK_EVENT } from "./back-events"
defineProps({
const props = defineProps({
title:{
type:String,
default:""
@@ -24,11 +25,31 @@ defineProps({
leftArrow:{
type:Boolean,
default:true
},
autoBack: {
type: Boolean,
default: true
},
safeBack: {
type: Boolean,
default: false
}
})
const emit = defineEmits(['click-left'])
const handleClickLeft = () => {
uni.navigateBack()
emit('click-left')
if (props.safeBack) {
uni.$emit(BEFORE_NAVIGATE_BACK_EVENT)
setTimeout(() => {
uni.navigateBack()
}, 80)
return
}
if (props.autoBack) {
uni.navigateBack()
}
}
</script>

View File

@@ -0,0 +1,46 @@
import { ref } from 'vue'
import { onBackPress } from '@dcloudio/uni-app'
import { BEFORE_NAVIGATE_BACK_EVENT } from './back-events'
/**
* 安全返回组合式函数。
* 在页面 setup 中调用,自动注册 onBackPress 拦截。
* 返回前先通过事件通知所有订阅组件(如 VideoPlayer执行清理
* 延迟后再执行 navigateBack避免 renderjs 组件销毁竞态。
*
* 用法:
* const { safeNavigateBack } = useSafeBack()
* // 配合 <nav-bar safe-back /> 即可,无需额外代码
*/
export function useSafeBack(options?: { delay?: number }) {
const leaving = ref(false)
const delay = options?.delay ?? 80
const safeNavigateBack = () => {
if (leaving.value) return
leaving.value = true
uni.$emit(BEFORE_NAVIGATE_BACK_EVENT)
setTimeout(() => {
uni.navigateBack()
}, delay)
}
onBackPress((event: any) => {
if (event?.from === 'navigateBack') {
return false
}
if (leaving.value) {
return true
}
safeNavigateBack()
return true
})
return {
leaving,
safeNavigateBack,
}
}