fix: set position

This commit is contained in:
Rogee
2024-12-13 17:05:51 +08:00
parent 7c52823610
commit 1fba1b1deb
8 changed files with 125 additions and 70 deletions

View File

@@ -1,7 +1,3 @@
<template> <template>
<router-view v-slot="{ Component }"> <router-view />
<keep-alive>
<component :is="Component" />
</keep-alive>
</router-view>
</template> </template>

View File

@@ -26,6 +26,7 @@ export default defineComponent({
const pageLimit = ref(10); const pageLimit = ref(10);
const offset = ref(""); const offset = ref("");
const loadData = () => { const loadData = () => {
// request /v1/medias // request /v1/medias
const data = { const data = {
@@ -34,12 +35,10 @@ export default defineComponent({
limit: pageLimit.value, limit: pageLimit.value,
bought: props.bought, bought: props.bought,
}; };
console.log("loadData, data: ", data);
request request
.post("/medias", data) .post("/medias", data)
.then((res) => { .then((res) => {
console.log("response: ", res);
if (res === undefined) { if (res === undefined) {
console.error("response error with undefined"); console.error("response error with undefined");
return; return;
@@ -51,10 +50,8 @@ export default defineComponent({
items.value = items.value.concat(res.data); items.value = items.value.concat(res.data);
} }
offset.value = res.data[res.data.length - 1].hash; offset.value = res.data[res.data.length - 1].hash;
console.log("offset: ", offset.value);
if (res.data.length < pageLimit.value) { if (res.data.length < pageLimit.value) {
console.log("finished");
finished.value = true; finished.value = true;
} }
}) })
@@ -63,7 +60,6 @@ export default defineComponent({
}) })
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
console.log("finally: ", loading.value, finished.value);
}); });
}; };

View File

@@ -1,55 +1,12 @@
import NotFound from '@/views/NotFound.vue' import { useScrollPosition } from '@/stores/scroll-position'
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/tabs/HomeView.vue' import routes from './routes'
import TabView from '../views/TabView.vue'
const router = createRouter({ const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL), history: createWebHistory(import.meta.env.BASE_URL),
routes: [ routes: routes,
{ path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },
{
path: '/t/:tenant',
name: 'tab',
component: TabView,
children: [
{
path: '',
name: 'tab.home',
component: HomeView,
meta: {
title: '首页',
}
},
{
path: 'bought',
name: 'tab.bought',
component: () => import('../views/tabs/BoughtView.vue'),
meta: {
title: '已购买',
}
},
{
path: 'user',
name: 'tab.user',
// route level code-splitting
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import('../views/tabs/UserView.vue'),
meta: {
title: '个人中心',
}
},
]
},
{
path: '/t/:tenant/play/:hash',
name: 'play',
component: () => import('../views/PlayView.vue'),
meta: {
title: '播放',
}
},
],
}) })
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
@@ -57,14 +14,14 @@ router.beforeEach((to, from, next) => {
name: from.name, name: from.name,
params: from.params, params: from.params,
} }
console.log("from", from, "goto: ", to)
if (from.meta.keepAlive) {
const { setPosition } = useScrollPosition()
const scrollTop = document.documentElement.scrollTop;
setPosition(from.fullPath, scrollTop);
}
next() next()
// if (from.matched.length === 0) {
// next({ name: 'tab.home', params: to.params })
// } else {
// next()
// }
}) })
router.afterEach((to, from) => { router.afterEach((to, from) => {

View File

@@ -0,0 +1,57 @@
import NotFound from '@/views/NotFound.vue';
import HomeView from '@/views/tabs/HomeView.vue';
import TabView from '@/views/TabView.vue';
const routes = [
{ path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },
{
path: '/t/:tenant',
name: 'tab',
component: TabView,
children: [
{
path: '',
name: 'tab.home',
component: HomeView,
meta: {
title: '首页',
keepAlive: true,
scrollTop: 0,
}
},
{
path: 'bought',
name: 'tab.bought',
component: () => import('@/views/tabs/BoughtView.vue'),
meta: {
title: '已购买',
keepAlive: true,
scrollTop: 0,
}
},
{
path: 'user',
name: 'tab.user',
// route level code-splitting
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import('@/views/tabs/UserView.vue'),
meta: {
title: '个人中心',
keepAlive: false,
}
},
]
},
{
path: '/t/:tenant/play/:hash',
name: 'play',
component: () => import('@/views/PlayView.vue'),
meta: {
title: '播放',
keepAlive: false,
}
},
]
export default routes;

View File

@@ -0,0 +1,17 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
export const useScrollPosition = defineStore('scroll-position', () => {
const pagePosition = ref({})
function getPosition(path) {
return pagePosition.value[path] || 0
}
function setPosition(path, position) {
pagePosition.value[path] = position
}
return { getPosition, setPosition }
})

View File

@@ -42,6 +42,7 @@
<script setup> <script setup>
import request from "@/utils/request"; import request from "@/utils/request";
import Hls from "hls.js"; import Hls from "hls.js";
import { onBeforeUnmount, onMounted } from "vue";
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@@ -57,7 +58,15 @@ const currentTime = ref(0);
const duration = ref(0); const duration = ref(0);
const playing = ref(false); const playing = ref(false);
onBeforeUnmount(() => {
const player = document.getElementById('video');
if (player && playing.value) {
stop();
}
})
onMounted(() => { onMounted(() => {
console.log(123123)
loadMedia(route.params.hash); loadMedia(route.params.hash);
const player = document.getElementById('video'); const player = document.getElementById('video');
player.addEventListener('timeupdate', updateTime); player.addEventListener('timeupdate', updateTime);
@@ -131,11 +140,14 @@ const play = (hash, type) => {
const updateTime = () => { const updateTime = () => {
const player = document.getElementById('video'); const player = document.getElementById('video');
currentTime.value = player.currentTime; currentTime.value = player?.currentTime;
}; };
const stop = () => { const stop = () => {
const player = document.getElementById('video'); const player = document.getElementById('video');
if (!player) {
return;
}
player.pause(); player.pause();
player.currentTime = 0; player.currentTime = 0;
currentTime.value = 0; currentTime.value = 0;

View File

@@ -1,5 +1,9 @@
<template> <template>
<RouterView /> <router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" />
</keep-alive>
</router-view>
<van-tabbar route v-model="active"> <van-tabbar route v-model="active">
<van-tabbar-item replace name="home" icon="home-o" <van-tabbar-item replace name="home" icon="home-o"
@@ -13,12 +17,9 @@
</template> </template>
<script setup> <script setup>
import { RouterView } from "vue-router"; import { RouterView, useRoute, useRouter } from "vue-router";
import { useRoute, useRouter } from "vue-router";
const active = ref("home"); const active = ref("home");
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
console.log("router: ", router.params);
console.log("route: ", route.params);
</script> </script>

View File

@@ -4,4 +4,23 @@
<script setup> <script setup>
import List from "@/components/List.vue"; import List from "@/components/List.vue";
import { useScrollPosition } from "@/stores/scroll-position";
import { onActivated } from "vue";
import { useRoute } from "vue-router";
const route = useRoute();
const { getPosition } = useScrollPosition();
onActivated(() => {
setTimeout(() => {
const position = getPosition(route.fullPath);
if (position) {
console.log("scroll to", position);
document.documentElement.scrollTo({
top: position,
});
}
}, 100)
});
</script> </script>