Browse Source

优化slide

pull/19/head
zyronon 4 years ago
parent
commit
d85cc89e00
  1. 65
      src/pages/test/TestSlide.vue
  2. 63
      src/pages/test/slide.js

65
src/pages/test/TestSlide.vue

@ -1,10 +1,33 @@
<template> <template>
<div id="TestSlide"> <div id="TestSlide">
<SlideRowList
v-if="false"
name="baseSlide"
v-model:active-index="baseActiveIndex">
<SlideItem>
<SlideRowList
style="height: calc(100% - 5rem);"
v-model:active-index="activeIndex">
<SlideItem>
<div id="TestSlide1"></div>
</SlideItem>
<SlideItem>
<div id="TestSlide2"></div>
</SlideItem>
</SlideRowList>
<Footer v-bind:init-tab="1"/>
</SlideItem>
<SlideItem>
<div id="TestSlide3"></div>
</SlideItem>
</SlideRowList>
<div id="TestSlide1" style="height: calc(100% - 5rem);"></div>
</div> </div>
</template> </template>
<script lang="jsx"> <script lang="jsx">
import Slide from "./slide"; import Slide from "./slide";
import Video from "../../components/Video"; import Video from "../../components/Video";
import resource from "../../assets/data/resource.js";
export default { export default {
name: "TestSlide", name: "TestSlide",
@ -15,8 +38,10 @@ export default {
data() { data() {
return { return {
totalSize: 52, totalSize: 52,
pageSize: 10, pageSize: 30,
pageNo: 0, pageNo: 0,
baseActiveIndex: 0,
activeIndex: 0,
} }
}, },
computed: {}, computed: {},
@ -24,7 +49,11 @@ export default {
created() { created() {
}, },
mounted() { mounted() {
let slide = new Slide('#TestSlide', { let list = resource.videos
list = list.concat(resource.videos)
list.splice(24, 6)
console.log(list.length)
let slide = new Slide('#TestSlide1', {
render: (item, itemIndex, play) => { render: (item, itemIndex, play) => {
return ( return (
<Video <Video
@ -39,25 +68,39 @@ export default {
/> />
) )
}, },
// list,
// index: 10,
request: this.$api.videos.recommended request: this.$api.videos.recommended
}) })
// let slide2 = new Slide('#TestSlide2', {
// render: (item, itemIndex, play) => {
// return (
// <Video
// isPlay={play}
// video={item}
// index={itemIndex}
// onShowComments={e => this.isCommenting = true}
// onShowShare={e => this.isSharing = true}
// onGoUserInfo={e => this.baseActiveIndex = 1}
// onGoMusic={e => this.$nav('/home/music')}
// v-model={[this.videos[itemIndex], 'video']}
// />
// )
// },
// request: this.$api.videos.recommended
// })
}, },
methods: { methods: {
async getData() { async getData() {
this.loading = true
let res = await this.$api.videos.recommended({pageNo: this.pageNo, pageSize: this.pageSize}) let res = await this.$api.videos.recommended({pageNo: this.pageNo, pageSize: this.pageSize})
console.log(res) console.log(res)
this.loading = false
if (res.code === this.SUCCESS) {
this.totalSize = res.data.total
this.videos = this.videos.concat(res.data.list)
// this.videos = this.$clone(this.localVideos)
} else {
this.pageNo--
}
}, },
} }
} }
if (import.meta.hot) {
}
</script> </script>
<style> <style>

63
src/pages/test/slide.js

@ -2,17 +2,17 @@ import Dom from "../../utils/dom";
import * as Vue from "vue"; import * as Vue from "vue";
export default class Slide { export default class Slide {
constructor(id, config) { constructor(id, config = {index: 0}) {
this.wrapper = this.create('<div class="slide-wrapper"></div>')
this.slideList = this.create('<div class="slide-list"></div>') this.slideList = this.create('<div class="slide-list"></div>')
this.slideList.addEventListener('touchstart', this.touchstart.bind(this)) this.slideList.addEventListener('touchstart', this.touchstart.bind(this))
this.slideList.addEventListener('touchmove', this.touchmove.bind(this)) this.slideList.addEventListener('touchmove', this.touchmove.bind(this))
this.slideList.addEventListener('touchend', this.touchend.bind(this)) this.slideList.addEventListener('touchend', this.touchend.bind(this))
this.wrapper.appendChild(this.slideList)
new Dom(id).append(new Dom(this.wrapper)) let container = new Dom(id)
// let container = document.querySelector(id) // container.css('height','100%')
// console.log(container) container.css('width', '100%')
// container.appendChild(this.wrapper) container.css('overflow', 'hidden')
container.append(new Dom(this.slideList))
this.total = 0 this.total = 0
this.pageSize = 10 this.pageSize = 10
this.pageNo = 0 this.pageNo = 0
@ -21,7 +21,7 @@ export default class Slide {
this.loading = false this.loading = false
this.judgeValue = 0 this.judgeValue = 0
this.index = 0 this.index = config.index || 0
this.startTime = 0 this.startTime = 0
@ -32,39 +32,31 @@ export default class Slide {
this.virtualTotal = 5 this.virtualTotal = 5
this.height = 812 this.height = parseFloat(container.css('height'))
this.isDrawDown = true this.isDrawDown = true
this.config = config this.config = config
this.appInsMap = new Map() this.appInsMap = new Map()
this.getData(this.pageNo) this.getData(this.pageNo)
} }
async getData(pageNo, init = true) { async getData(pageNo, init = true) {
// if (this.config.request) { if (this.config.list && this.config.list.length) {
// let res = await this.config.request({pageNo: this.pageNo, pageSize: this.pageSize}) if (init) {
// if (res.code === 200) { for (let i = 0; i < this.config.list.length / this.virtualTotal; i++) {
// this.total = res.data.total this.listMap.set(i, this.config.list.slice(i * this.virtualTotal, (i + 1) * this.virtualTotal))
// }
// res.data.list.map((v, i) => { this.init()
// let el = this.getInsEl(v, i, false) }
// let item = this.create('<div class="slide-item"></div>') } else {
// item.appendChild(el) this.getRecommend(pageNo).then(r => {
// this.slideList.appendChild(item)
// })
// }
// }
this.getRecommend(pageNo).then(
r => {
init && this.init() init && this.init()
})
} }
)
} }
async getRecommend(pageNo) { async getRecommend(pageNo) {
if (pageNo === 1) return // if (pageNo === 1) return
if (this.config.request) { if (this.config.request) {
if (this.listMap.has(pageNo)) return if (this.listMap.has(pageNo)) return
this.loading = true this.loading = true
let res = await this.config.request({pageNo, pageSize: this.pageSize}) let res = await this.config.request({pageNo, pageSize: this.pageSize})
@ -72,7 +64,7 @@ export default class Slide {
if (res.code === 200) { if (res.code === 200) {
this.total = res.data.total this.total = res.data.total
this.pageNo = pageNo this.pageNo = pageNo
console.log('请求数据', res.data.list) // console.log('请求数据', res.data.list)
this.listMap.set(pageNo, res.data.list) this.listMap.set(pageNo, res.data.list)
// this.list = this.list.concat(res.data.list) // this.list = this.list.concat(res.data.list)
} }
@ -81,7 +73,7 @@ export default class Slide {
init() { init() {
this.getList().slice(this.index, this.index + this.virtualTotal).map((v, i) => { this.getList().slice(this.index, this.index + this.virtualTotal).map((v, i) => {
let el = this.getInsEl(v, i, false) let el = this.getInsEl(v, this.index + i, false)
this.slideList.appendChild(el) this.slideList.appendChild(el)
}) })
this.setActive() this.setActive()
@ -130,19 +122,14 @@ export default class Slide {
if (this.isDrawDown) { if (this.isDrawDown) {
if (this.index === this.getList().length - 1) { if (this.index === this.getList().length - 1) {
this.css(this.slideList, 'transform', `translate3d(0px, ${ this.css(this.slideList, 'transform', `translate3d(0px, ${this.getHeight() + (Math.abs(this.moveYDistance) > this.height / 5 ? -this.height / 5 : this.moveYDistance)}px, 0px)`)
this.getHeight() + (Math.abs(this.moveYDistance) > this.height / 5 ? -this.height / 5 : this.moveYDistance)
}px, 0px)`)
return return
} }
} else { } else {
if (this.index === 0) return if (this.index === 0) return
} }
this.css(this.slideList, 'transform', `translate3d(0px, ${ this.css(this.slideList, 'transform', `translate3d(0px, ${this.getHeight() + this.moveYDistance + (this.isDrawDown ? this.judgeValue : -this.judgeValue)}px, 0px)`)
this.getHeight() + this.moveYDistance +
(this.isDrawDown ? this.judgeValue : -this.judgeValue)
}px, 0px)`)
} }
touchend() { touchend() {
@ -154,7 +141,7 @@ export default class Slide {
} }
} }
let canSlide = this.height / 8 < Math.abs(this.moveYDistance); let canSlide = this.height / 8 < Math.abs(this.moveYDistance) && Math.abs(this.moveYDistance) > 40;
if (Date.now() - this.startTime < 40) canSlide = false if (Date.now() - this.startTime < 40) canSlide = false
if (canSlide) { if (canSlide) {

Loading…
Cancel
Save