feat: 更新视频播放器组件,添加章节视频功能并优化返回逻辑
This commit is contained in:
1
components/nav-bar/back-events.ts
Normal file
1
components/nav-bar/back-events.ts
Normal file
@@ -0,0 +1 @@
|
||||
export const BEFORE_NAVIGATE_BACK_EVENT = '__edu_before_navigate_back__'
|
||||
@@ -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>
|
||||
|
||||
|
||||
46
components/nav-bar/use-safe-back.ts
Normal file
46
components/nav-bar/use-safe-back.ts
Normal 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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user