feat: 支持移动端长按缩略图后拖拽调整顺序(#130)

This commit is contained in:
pipipi-pikachu 2022-08-25 22:27:34 +08:00
parent 2fab9dd93a
commit f4ad49fd50
3 changed files with 50 additions and 17 deletions

View File

@ -138,6 +138,18 @@ export default () => {
mainStore.updateSelectedSlidesIndex(newSelectedSlidesIndex) mainStore.updateSelectedSlidesIndex(newSelectedSlidesIndex)
} }
// 拖拽调整幻灯片顺序同步数据
const sortSlides = (newIndex: number, oldIndex: number) => {
if (oldIndex === newIndex) return
const _slides = JSON.parse(JSON.stringify(slides.value))
const _slide = _slides[oldIndex]
_slides.splice(oldIndex, 1)
_slides.splice(newIndex, 0, _slide)
slidesStore.setSlides(_slides)
slidesStore.updateSlideIndex(newIndex)
}
return { return {
resetSlides, resetSlides,
updateSlideIndex, updateSlideIndex,
@ -149,5 +161,6 @@ export default () => {
deleteSlide, deleteSlide,
cutSlide, cutSlide,
selectAllSlide, selectAllSlide,
sortSlides,
} }
} }

View File

@ -81,6 +81,7 @@ const {
deleteSlide, deleteSlide,
cutSlide, cutSlide,
selectAllSlide, selectAllSlide,
sortSlides,
} = useSlideHandler() } = useSlideHandler()
// //
@ -153,14 +154,7 @@ const setThumbnailsFocus = (focus: boolean) => {
// //
const handleDragEnd = (eventData: { newIndex: number; oldIndex: number }) => { const handleDragEnd = (eventData: { newIndex: number; oldIndex: number }) => {
const { newIndex, oldIndex } = eventData const { newIndex, oldIndex } = eventData
if (oldIndex === newIndex) return sortSlides(newIndex, oldIndex)
const _slides = JSON.parse(JSON.stringify(slides.value))
const _slide = _slides[oldIndex]
_slides.splice(oldIndex, 1)
_slides.splice(newIndex, 0, _slide)
slidesStore.setSlides(_slides)
slidesStore.updateSlideIndex(newIndex)
} }
const { enterScreening, enterScreeningFromStart } = useScreening() const { enterScreening, enterScreeningFromStart } = useScreening()

View File

@ -1,15 +1,28 @@
<template> <template>
<div class="mobile-thumbnails"> <div class="mobile-thumbnails">
<div <Draggable
class="thumbnail-item" class="thumbnail-list"
v-for="(slide, index) in slides" :modelValue="slides"
:key="slide.id" :animation="300"
:class="{ 'active': slideIndex === index }" :scroll="true"
@click="changeSlideIndex(index)" :scrollSensitivity="50"
:setData="null"
itemKey="id"
:delayOnTouchOnly="true"
:delay="800"
@end="handleDragEnd"
> >
<div class="label">{{ index + 1 }}</div> <template #item="{ element, index }">
<ThumbnailSlide class="thumbnail" :slide="slide" :size="120" :visible="index < slidesLoadLimit" /> <div
</div> class="thumbnail-item"
:class="{ 'active': slideIndex === index }"
@click="changeSlideIndex(index)"
>
<div class="label">{{ index + 1 }}</div>
<ThumbnailSlide class="thumbnail" :slide="element" :size="120" :visible="index < slidesLoadLimit" />
</div>
</template>
</Draggable>
</div> </div>
</template> </template>
@ -17,16 +30,26 @@
import { storeToRefs } from 'pinia' import { storeToRefs } from 'pinia'
import { useSlidesStore } from '@/store' import { useSlidesStore } from '@/store'
import useLoadSlides from '@/hooks/useLoadSlides' import useLoadSlides from '@/hooks/useLoadSlides'
import useSlideHandler from '@/hooks/useSlideHandler'
import Draggable from 'vuedraggable'
import ThumbnailSlide from '@/views/components/ThumbnailSlide/index.vue' import ThumbnailSlide from '@/views/components/ThumbnailSlide/index.vue'
const slidesStore = useSlidesStore() const slidesStore = useSlidesStore()
const { slides, slideIndex } = storeToRefs(slidesStore) const { slides, slideIndex } = storeToRefs(slidesStore)
const { sortSlides } = useSlideHandler()
const { slidesLoadLimit } = useLoadSlides() const { slidesLoadLimit } = useLoadSlides()
const changeSlideIndex = (index: number) => { const changeSlideIndex = (index: number) => {
slidesStore.updateSlideIndex(index) slidesStore.updateSlideIndex(index)
} }
//
const handleDragEnd = (eventData: { newIndex: number; oldIndex: number }) => {
const { newIndex, oldIndex } = eventData
sortSlides(newIndex, oldIndex)
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -67,6 +90,9 @@ const changeSlideIndex = (index: number) => {
padding: 0 5px; padding: 0 5px;
} }
} }
.sortable-chosen {
top: -5px;
}
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 0; width: 0;