From 1967f1931b52561a3c1b18f136899cd4516d87db Mon Sep 17 00:00:00 2001 From: zyronon Date: Sat, 18 Feb 2023 15:42:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/slide/BVideo.vue | 9 +- .../slide/SlideVerticalInfinite.vue | 13 +- src/components/slide/common.js | 1 - src/pages/home/index.vue | 198 +++++++++++++----- 4 files changed, 164 insertions(+), 57 deletions(-) diff --git a/src/components/slide/BVideo.vue b/src/components/slide/BVideo.vue index 6b4699f..6b3d1ad 100644 --- a/src/components/slide/BVideo.vue +++ b/src/components/slide/BVideo.vue @@ -282,8 +282,13 @@ export default { this.commentVisible = false } }, - click({id, type}) { - if (this.item.id === id) { + click({baseIndex, navIndex, itemIndex, type}) { + // console.log(baseIndex, navIndex, itemIndex, this.position) + if ( + this.position.baseIndex === baseIndex && + this.position.navIndex === navIndex && + this.position.itemIndex === itemIndex + ) { if (type === EVENT_KEY.ITEM_TOGGLE) { if (this.status === SlideItemPlayStatus.Play) { this.pause() diff --git a/src/components/slide/SlideVerticalInfinite.vue b/src/components/slide/SlideVerticalInfinite.vue index 18f4269..47a2e98 100644 --- a/src/components/slide/SlideVerticalInfinite.vue +++ b/src/components/slide/SlideVerticalInfinite.vue @@ -44,7 +44,7 @@ const props = defineProps({ const emit = defineEmits(['update:index', 'loadMore']) const appInsMap = new Map() -const itemClassName = 'slide-item2' +const itemClassName = 'slide-item' const wrapperEl = ref(null) const state = reactive({ name: props.name, @@ -91,14 +91,16 @@ watch( watch( () => props.index, (newVal, oldVal) => { - // console.log('watch-index', newVal, oldVal, props.list[newVal].id) + // console.log('watch-index', newVal, oldVal,props.list, props.list[newVal].id) bus.emit(EVENT_KEY.SINGLE_CLICK_BROADCAST, { - id: props.list[newVal].id, + ...props.position, + itemIndex: newVal, type: EVENT_KEY.ITEM_PLAY }) setTimeout(() => { bus.emit(EVENT_KEY.SINGLE_CLICK_BROADCAST, { - id: props.list[oldVal].id, + ...props.position, + itemIndex: oldVal, type: EVENT_KEY.ITEM_STOP }) }, 200) @@ -110,7 +112,6 @@ onMounted(() => { insertContent() }) -//默认使用this.list,刷新时,考虑到vue可能更新外面的videos到this.list数据没有那么快,因为我要立即刷新 function insertContent(list = props.list) { $(wrapperEl.value).empty() let half = (props.virtualTotal - 1) / 2 @@ -155,7 +156,7 @@ function dislike(item) { defineExpose({dislike}) function getInsEl(item, index, play = false) { - console.log('index', index, play) + // console.log('index', index, play) let slideVNode = props.render(item, index, play, props.position) const app = createApp({ render() { diff --git a/src/components/slide/common.js b/src/components/slide/common.js index b5d8e96..8267367 100644 --- a/src/components/slide/common.js +++ b/src/components/slide/common.js @@ -44,7 +44,6 @@ export function slideTouchMove(e, el, state, judgeValue, canNextCb, nextCb, type let canSlideRes = canSlide(state, judgeValue, type) - //当 if (canSlideRes && state.localIndex === 0 && !isNext && type === SlideType.VERTICAL) { bus.emit(state.name + '-moveY', state.move.y) } diff --git a/src/pages/home/index.vue b/src/pages/home/index.vue index 63d8c48..cb008df 100644 --- a/src/pages/home/index.vue +++ b/src/pages/home/index.vue @@ -5,19 +5,17 @@ - -
+
- +
@@ -62,23 +60,23 @@ v-if="state.subType===-1 && !state.subTypeVisible" @click="showSubType">附近吃喝玩乐
+ - + @loadMore="loadSlide1More" + @refresh="() => getSlide0Data(true)" + />
@@ -90,19 +88,20 @@ + @@ -187,7 +186,7 @@ import BVideo from "../../components/slide/BVideo.vue"; import Comment from "../../components/Comment.vue"; import Share from "../../components/Share.vue"; import IndicatorHome from "./components/IndicatorHome.vue"; -import {computed, onMounted, onUnmounted, reactive, ref} from "vue"; +import {computed, onMounted, onUnmounted, reactive, ref, watch} from "vue"; import bus, {EVENT_KEY} from "../../utils/bus"; import {useNav} from "@/utils/hooks/useNav"; import Utils from "@/utils"; @@ -205,6 +204,7 @@ import ShareToFriend from "@/pages/home/components/ShareToFriend.vue"; import UserPanel from "@/components/UserPanel.vue"; import Community from "@/pages/home/components/Community.vue"; import Shop from "@/pages/home/components/Shop.vue"; +import Loading from "@/components/Loading.vue"; const nav = useNav() @@ -221,9 +221,49 @@ const subTypeRef = ref(null) const recommendListRef = ref(null) const state = reactive({ baseIndex: 0, - navIndex: 4, - itemIndex: 0, + navIndex: 0, test: '', + slide0: { + loading: false, + index: 0, + list: [], + totalSize: 0, + pageSize: 10, + pageNo: 0, + }, + slide1: { + loading: false, + index: 0, + list: [], + totalSize: 0, + pageSize: 10, + pageNo: 0, + }, + slide2: { + loading: false, + index: 0, + list: [], + totalSize: 0, + pageSize: 10, + pageNo: 0, + }, + slide3: { + loading: false, + index: 0, + list: [], + totalSize: 0, + pageSize: 10, + pageNo: 0, + }, + slide4: { + loading: false, + index: 0, + list: [], + totalSize: 0, + pageSize: 10, + pageNo: 0, + }, + slideOneList: [], recommendList: [ // { // type: 'img', @@ -240,7 +280,6 @@ const state = reactive({ ], isSharing: false, canMove: true, - loading: false, shareType: -1, @@ -262,36 +301,90 @@ const state = reactive({ subTypeHeight: '0', //用于改变zindex的层级到上层,反正比slide高就行。不然摸不到subType. subTypeIsTop: false, - totalSize: 0, - pageSize: 10, - pageNo: 0, }) -async function getData(refresh = false) { - // if (process.env.NODE_ENV !== 'development') { - // state.totalSize = 11 - // return state.recommendVideos = resource.videos - // } - if (state.loading) return - state.loading = true - let res = await api.videos.recommended({pageNo: refresh ? 0 : state.pageNo, pageSize: state.pageSize}) - console.log('loadMore-', 'refresh', refresh, res) - state.loading = false +const loading = computed(() => { + return state[`slide${state.navIndex}`].loading +}) + +watch( + () => state.navIndex, + (newVal, oldValue) => { + if (newVal === 0 && state.slide0.list.length === 0) { + return getSlide0Data() + } + if (newVal === 4 && state.slide4.list.length === 0) { + return getSlide4Data() + } + if (newVal === 2) return + if ([0, 2, 4].includes(newVal)) { + let playItemIndex = state[`slide${newVal}`].index + bus.emit(EVENT_KEY.SINGLE_CLICK_BROADCAST, { + baseIndex: state.baseIndex, + navIndex: newVal, + itemIndex: playItemIndex, + type: EVENT_KEY.ITEM_TOGGLE + }) + } + if ([0, 2, 4].includes(oldValue)) { + let stopItemIndex = state[`slide${oldValue}`].index + setTimeout(() => { + bus.emit(EVENT_KEY.SINGLE_CLICK_BROADCAST, { + baseIndex: state.baseIndex, + navIndex: oldValue, + itemIndex: stopItemIndex, + type: EVENT_KEY.ITEM_STOP + }) + }, 200) + } + + }) + +function loadSlide1More() { + if (!state.loading) { + state.slide0.pageNo++ + getSlide0Data() + } +} + +async function getSlide0Data(refresh = false) { + if (state.slide0.loading) return + state.slide0.loading = true + let res = await api.videos.recommended({pageNo: refresh ? 0 : state.slide0.pageNo, pageSize: state.slide0.pageSize}) + console.log('getSlide0Data-', 'refresh', refresh, res) + state.slide0.loading = false if (res.code === 200) { - state.totalSize = res.data.total + state.slide0.totalSize = res.data.total if (refresh) { - state.recommendList = [] + state.slide0.list = [] } - state.recommendList = state.recommendList.concat(res.data.list) + state.slide0.list = state.slide0.list.concat(res.data.list) } else { - state.pageNo-- + state.slide0.pageNo-- } } -function loadMore() { +async function getSlide4Data(refresh = false) { + if (state.slide4.loading) return + state.slide4.loading = true + let res = await api.videos.recommended({pageNo: refresh ? 0 : state.slide4.pageNo, pageSize: state.slide4.pageSize}) + console.log('getSlide4Data-', 'refresh', refresh, res) + state.slide4.loading = false + if (res.code === 200) { + state.slide4.totalSize = res.data.total + if (refresh) { + state.slide4.list = [] + } + state.slide4.list = state.slide4.list.concat(res.data.list) + } else { + state.slide4.pageNo-- + } +} + +function loadSlide4More() { if (!state.loading) { state.pageNo++ - getData() + getSlide4Data() } } @@ -330,13 +423,22 @@ function end() { } onMounted(() => { - getData() + // getData() + getSlide0Data() bus.on(EVENT_KEY.SINGLE_CLICK, () => { - let id = '' + let itemIndex = -1 if (state.navIndex === 4) { - id = state.recommendList[state.itemIndex].id + itemIndex = state.slide4.index + } + if (state.navIndex === 0) { + itemIndex = state.slide0.index } - bus.emit(EVENT_KEY.SINGLE_CLICK_BROADCAST, {id, type: EVENT_KEY.ITEM_TOGGLE}) + bus.emit(EVENT_KEY.SINGLE_CLICK_BROADCAST, { + baseIndex: state.baseIndex, + navIndex: state.navIndex, + itemIndex, + type: EVENT_KEY.ITEM_TOGGLE + }) }) bus.on('update:item', val => { const {baseIndex, navIndex, itemIndex} = val.position @@ -422,7 +524,7 @@ function render(item, itemIndex, play, position) { height: calc(100vh - @footer-height) !important; overflow: hidden; - #slide1 { + #slide0 { position: relative; .sub-type { @@ -487,7 +589,7 @@ function render(item, itemIndex, play, position) { color: white; } - #slide1-infinite { + #slide0-infinite { z-index: 1; margin-top: 0; transition: height, margin-top .3s;